swift 3 中的 AlamofireObjectMapper
AlamofireObjectMapper in swift 3
我想第一次使用 AlamofireObjectMapper 来解析 swift 中的 json 响应。
响应是:
"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?'
这部分代码有问题:
func mapping(map: Map) {
name<-map["name"]
val<-map["val"]
}
在引号中。
你应该做的是地图字典:
var quotes: [String : CGFloat] = [:]
映射时使用:
quotes <- map["quotes"]
看看:
https://github.com/Hearst-DD/ObjectMapper
基础是映射字典。
更具体地说,在 quote 对象中你没有 name 和 val JSON 对象,这正是你想要的。如果将其映射到字典,您将能够访问这些值。
还没有看到你的图片 - 但如果你不在上方进行更改,应用程序将会崩溃。
对于上述问题,您需要提供您想要 运行 您的请求的队列,如果您不想弄乱它并且您实际上想要 keyPath,那么您需要调用函数keyPath:
而不是 queue:
。 Link:
https://github.com/tristanhimmelman/AlamofireObjectMapper
查找数组响应
有几个问题。
您想引用 DataResponse<ModelCurrency>
而不是 DataResponse<[Quotes]>
。
您想使用 responseObject
,而不是 responseArray
。
您不想将 queue
参数与 String
值一起使用。 queue
参数用于指定您希望完成处理程序分配给哪个调度队列 运行。但这不是你在这里做的,所以你应该删除它。
与 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: [=11=].key, val: [=11=].value) }
}
}
class Quote {
var name : String?
var val : CGFloat?
init(name: String?, val: CGFloat?) {
self.name = name
self.val = val
}
}
(我已将 Quotes
重命名为 Quote
,因为它似乎是单一货币的报价。)
我想第一次使用 AlamofireObjectMapper 来解析 swift 中的 json 响应。
响应是:
"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?'
这部分代码有问题:
func mapping(map: Map) {
name<-map["name"]
val<-map["val"]
}
在引号中。
你应该做的是地图字典:
var quotes: [String : CGFloat] = [:]
映射时使用:
quotes <- map["quotes"]
看看:
https://github.com/Hearst-DD/ObjectMapper
基础是映射字典。
更具体地说,在 quote 对象中你没有 name 和 val JSON 对象,这正是你想要的。如果将其映射到字典,您将能够访问这些值。
还没有看到你的图片 - 但如果你不在上方进行更改,应用程序将会崩溃。
对于上述问题,您需要提供您想要 运行 您的请求的队列,如果您不想弄乱它并且您实际上想要 keyPath,那么您需要调用函数keyPath:
而不是 queue:
。 Link:
https://github.com/tristanhimmelman/AlamofireObjectMapper
查找数组响应
有几个问题。
您想引用
DataResponse<ModelCurrency>
而不是DataResponse<[Quotes]>
。您想使用
responseObject
,而不是responseArray
。您不想将
queue
参数与String
值一起使用。queue
参数用于指定您希望完成处理程序分配给哪个调度队列 运行。但这不是你在这里做的,所以你应该删除它。与
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: [=11=].key, val: [=11=].value) }
}
}
class Quote {
var name : String?
var val : CGFloat?
init(name: String?, val: CGFloat?) {
self.name = name
self.val = val
}
}
(我已将 Quotes
重命名为 Quote
,因为它似乎是单一货币的报价。)