2016-11-24 5 views
2

AlamofireObjectMapper를 처음 사용하여 신속하게 json 응답을 구문 분석하려고합니다.AlamofireObjectMapper in swift 3

응답은 다음과 같습니다

"success": true, 
    "terms": "https:\/\/currencylayer.com\/terms", 
    "privacy": "https:\/\/currencylayer.com\/privacy", 
    "timestamp": 1480007048, 
    "source": "USD", 
    "quotes": { 
    "USDAED": 3.672598, 
    "USDAFN": 66.599998, 
    "USDALL": 127.999937, 
    "USDAMD": 478.679993, 
    "USDANG": 1.780277, 
    "USDAOA": 165.072998, 
    "USDARS": 15.497261, 
    "USDAUD": 1.348899, 
    "USDAWG": 1.79, 
    "USDAZN": 1.714104, 
    "USDBAM": 1.855297, 
    "USDBBD": 2, 
    "USDBDT": 79.179735, 
    "USDBGN": 1.854199, 
    "USDBHD": 0.377036, 
    "USDBIF": 1668.300049, 
    "USDBMD": 1, 
    "USDBND": 1.429902, 
    "USDBOB": 6.870014, 
    "USDBRL": 3.396898, 
    "USDBSD": 1, 
} 

내가 이런 식으로 매핑 :

class ModelCurrency: Mappable { 

    var success : Bool? 
    var terms  : String? 
    var privacy : String? 
    var timestamp : CGFloat? 
    var source : String? 
    var quotes : [Quotes]? 

    init() {} 

    required init?(map: Map) { 

    } 

    func mapping(map: Map) { 

     success<-map["success"] 
     terms<-map["terms"] 
     privacy<-map["privacy"] 
     timestamp<-map["timestamp"] 
     source<-map["source"] 
     quotes<-map["quotes"] 

     print("It json\(terms)") 
    } 
} 

class Quotes : Mappable { 

    var name : String? 
    var val : CGFloat? 

    required init?(map: Map) { 

    } 

    func mapping(map: Map) { 
     name<-map["name"] 
     val<-map["val"] 
    } 
} 

을 그리고 내 컨트롤러 :

override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.delegate = self 
     tableView.dataSource = self 

     super.viewDidLoad() 
     let URL = "http://www.apilayer.net/api/live?access_key=ad847a0a855c0647590df2b818923025" 

Alamofire.request(URL).responseArray(queue: "quotes") { (response: DataResponse<[Quotes]>) in 
      let arrayCurency = response.result.value! 


       for quotes in arrayCurency { 
        print(quotes.name!) 
        print(quotes.val!) 
       } 

     } 

    } 

그것은 나에게 오류 매핑이 오류를 제공합니다 :

cannot convert value 'String' to expected argument type 'DispatchQueue?'

enter image description here

답변

1

은 몇 가지 문제가 있습니다.

  1. 당신은 DataResponse<ModelCurrency>보다는 DataResponse<[Quotes]> 참조 할.

  2. responseArray이 아닌 responseObject을 사용하려고합니다.

  3. 해당 queue 매개 변수를 String 값으로 사용하고 싶지 않습니다. queue 매개 변수는 완료 핸들러를 실행할 디스패치 큐를 지정하는 데 사용됩니다. 하지만 여기서하는 일이 아니므로 그냥 제거해야합니다.

  4. quotes 키와 관련된 값은 개체 배열이 아닙니다. 그것은 또 다른 사전입니다. 따라서 사전에 매핑 한 다음 map 메서드를 사용하여이를 Quote 개체의 배열로 변환해야합니다.

그래서, 모두 함께 당겨 :

Alamofire.request(urlString).responseObject { (response: DataResponse<ModelCurrency>) in 
    ... 
} 

그리고

class ModelCurrency: Mappable { 

    var success : Bool? 
    var terms  : String? 
    var privacy : String? 
    var timestamp : CGFloat? 
    var source : String? 
    var quotes : [Quote]? 

    required init?(map: Map) { } 

    func mapping(map: Map) { 

     success <- map["success"] 
     terms  <- map["terms"] 
     privacy <- map["privacy"] 
     timestamp <- map["timestamp"] 
     source  <- map["source"] 

     var dictionary: [String: CGFloat]? 
     dictionary <- map["quotes"] 
     quotes = dictionary?.map { return Quote(name: $0.key, val: $0.value) } 
    } 
} 

class Quote { 

    var name : String? 
    var val : CGFloat? 

    init(name: String?, val: CGFloat?) { 
     self.name = name 
     self.val = val 
    } 

} 

(는 단일 통화 견적 것으로 나타나는대로 내가 QuoteQuotes 이름을 변경 한

합니다.)

+0

당신이 말한대로했는데 arrayCurency 오류의 인용문 행에 오류가 있습니다. 형식 ModelCurrency가 프로토콜 Sequence를 준수하지 않습니다. 어떻게해야합니까? –

+0

첫 번째 rwite responsObject 내가 가지고있는 오류 : 'ModelCurrence'형식의 프로토콜을 준수하지 않습니다. 신속한 처리 하지만 응답을 작성합니다. 배열에 오류가 있습니다. ValueTupe ModelCurrence가 'name'및 'val'멤버가 아닙니다. –

+0

Alamofire .request (URL) .responseObject {(응답 : DataResponse ) in arrayCurency = response.result.value! arrayCurency에서 따옴표에 대한 { 인쇄 (! quotes.name) 인쇄 (quotes.val!)} } –

0

문제는이 코드 부분이다 : 따옴표로

func mapping(map: Map) { 
    name<-map["name"] 
    val<-map["val"] 
} 

.

var quotes: [String : CGFloat] = [:] 

때 매핑 사용 :

quotes <- map["quotes"] 

을 살펴 보자 기초에서

https://github.com/Hearst-DD/ObjectMapper

당신은 무엇을해야하는지도 사전입니다 매핑 사전.

더 구체적으로 quote 객체에는 이름과 val JSON 객체가 없으므로 원하는 것입니다. 사전에 매핑하면 해당 값에 액세스 할 수 있습니다.

이미지를 보지 못했습니다. 그러나 변경하지 않으면 앱이 다운됩니다.

위의 문제에 대해 요청을 실행하려는 큐를 제공해야합니다.이를 원하지 않고 실제로 keyPath를 원할 경우 queue: 대신 keyPath:을 사용하여 함수를 호출해야합니다. 링크 : 배열 응답에 대한

https://github.com/tristanhimmelman/AlamofireObjectMapper

모습

+0

내 문제는 .responseArray (대기열 : quotes) 오류입니다. 'String'을 예상되는 인수로 변환 할 수 없습니다. 'DispatchQueue?'를 입력하십시오. 나는 바른 따옴표를 씁니다 : [String : CGFloat] = [:] 아무것도 바뀌지 않았습니다. var 성공 : Bool? var terms : String? var privacy : String? var timestamp : CGFloat? var source : String? var 인용문 : [String : CGFloat] = [:] –

+0

나머지 답변을 살펴보십시오. keyPath를 제공하기 위해 대기열 대신 시도 했습니까? – Miknash