在 NSDictionary 上使用地图
Using map on NSDictionary
设置
- 我正在使用 API
从我的服务器加载数据
- return编辑的数据在JSON
- API提供的JSON如下图
- 我使用 ALAMOFIRE 从 API 接收数据并解析 JSON 响应
JSON
{
data: [
{
owner: "FREDL",
street: "Apothekergasse 1",
latitude: "48.261900",
longitude: "11.445200"
}
],
meta: "Testmeta"
}
迪拉姆CLASS
class AED: NSObject {
let owner: String
let street: String
let mapType: String
let coordinate: CLLocationCoordinate2D
init(owner: String, street: String, mapType: String, coordinate: CLLocationCoordinate2D) {
self.owner = owner
self.street = street
self.mapType = mapType
self.coordinate = coordinate
super.init()
}
}
问题
我想对结果项使用 map
函数,为 API 提供的每个结果创建一个 AED
对象。
func getAvailableAEDsInRange(#latitude: Float, longitude: Float) {
Alamofire.request(MFNetworkController.Router.getAEDInRange(latitude: latitude, longitude: longitude)).responseJSON() {
(_, _, JSON, error) in
if error == nil {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
let aedInfo = ((JSON as! NSDictionary).valueForKey("data") as! [NSDictionary])
aedInfo.map() {
(...)
}
println(aedInfo)
}
}
}
}
错误信息
Cannot invoke 'map' with an argument list of type '((_) -> _)'
问题
- 因为我提供了一个结果字典并且我通过
[=18=]["owner"]
访问了参数,为什么会出现这个错误消息?
- 例如,当我使用
println([=19=]["owner"]
时,我得到了一个结果并且错误消失了。为什么可以访问?
更新
我更改了问题函数,如上所示。当我将代码拆分为:
let aedInfo = ((JSON as! NSDictionary).valueForKey("data") as! [NSDictionary])
和
aedInfo.map() {}
然后我已经得到了错误信息:
Cannot invoke 'map' with an argument list of type '((_) -> _)'
aedInfo 的输出是:
[{
latitude = "48.261900";
longitude = "11.445200";
owner = FREDL;
street = "Apothekergasse 1";
}]
这就是我所期望的字典数组。但是为什么map函数return报错呢?
更新 2
我在 Ray Wenderlich 上找到了一个例子,他也采用了相同的方法。但是没有错误。那区别在哪里呢?
// 3
Alamofire.request(Five100px.Router.PopularPhotos(self.currentPage)).响应JSON() {
(_, _, JSON, 错误) 在
if error == nil {
// 4
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
// 5, 6, 7
let photoInfos = ((JSON as! NSDictionary).valueForKey("photos") as! [NSDictionary]).filter({ ([=14=]["nsfw"] as! Bool) == false }).map { PhotoInfo(id: [=14=]["id"] as! Int, url: [=14=]["image_url"] as! String) }
// 8
let lastItem = self.photos.count
// 9
self.photos.addObjectsFromArray(photoInfos)
// 10
let indexPaths = (lastItem..<self.photos.count).map { NSIndexPath(forItem: [=14=], inSection: 0) }
// 11
dispatch_async(dispatch_get_main_queue()) {
self.collectionView!.insertItemsAtIndexPaths(indexPaths)
}
self.currentPage++
}
}
self.populatingPhotos = false
}
}
Xcode 不能相信它在 Swift 中出错的原因,但你可以相信它指出了正确的位置:)
CLLocationCoordinate2dMake() as! Float
会产生错误。因为您不能将结构转换为数字。
删除 as! Float
,您的错误就会消失。
设置
- 我正在使用 API 从我的服务器加载数据
- return编辑的数据在JSON
- API提供的JSON如下图
- 我使用 ALAMOFIRE 从 API 接收数据并解析 JSON 响应
JSON
{
data: [
{
owner: "FREDL",
street: "Apothekergasse 1",
latitude: "48.261900",
longitude: "11.445200"
}
],
meta: "Testmeta"
}
迪拉姆CLASS
class AED: NSObject {
let owner: String
let street: String
let mapType: String
let coordinate: CLLocationCoordinate2D
init(owner: String, street: String, mapType: String, coordinate: CLLocationCoordinate2D) {
self.owner = owner
self.street = street
self.mapType = mapType
self.coordinate = coordinate
super.init()
}
}
问题
我想对结果项使用 map
函数,为 API 提供的每个结果创建一个 AED
对象。
func getAvailableAEDsInRange(#latitude: Float, longitude: Float) {
Alamofire.request(MFNetworkController.Router.getAEDInRange(latitude: latitude, longitude: longitude)).responseJSON() {
(_, _, JSON, error) in
if error == nil {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
let aedInfo = ((JSON as! NSDictionary).valueForKey("data") as! [NSDictionary])
aedInfo.map() {
(...)
}
println(aedInfo)
}
}
}
}
错误信息
Cannot invoke 'map' with an argument list of type '((_) -> _)'
问题
- 因为我提供了一个结果字典并且我通过
[=18=]["owner"]
访问了参数,为什么会出现这个错误消息? - 例如,当我使用
println([=19=]["owner"]
时,我得到了一个结果并且错误消失了。为什么可以访问?
更新
我更改了问题函数,如上所示。当我将代码拆分为:
let aedInfo = ((JSON as! NSDictionary).valueForKey("data") as! [NSDictionary])
和
aedInfo.map() {}
然后我已经得到了错误信息:
Cannot invoke 'map' with an argument list of type '((_) -> _)'
aedInfo 的输出是:
[{
latitude = "48.261900";
longitude = "11.445200";
owner = FREDL;
street = "Apothekergasse 1";
}]
这就是我所期望的字典数组。但是为什么map函数return报错呢?
更新 2
我在 Ray Wenderlich 上找到了一个例子,他也采用了相同的方法。但是没有错误。那区别在哪里呢?
// 3 Alamofire.request(Five100px.Router.PopularPhotos(self.currentPage)).响应JSON() { (_, _, JSON, 错误) 在
if error == nil {
// 4
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
// 5, 6, 7
let photoInfos = ((JSON as! NSDictionary).valueForKey("photos") as! [NSDictionary]).filter({ ([=14=]["nsfw"] as! Bool) == false }).map { PhotoInfo(id: [=14=]["id"] as! Int, url: [=14=]["image_url"] as! String) }
// 8
let lastItem = self.photos.count
// 9
self.photos.addObjectsFromArray(photoInfos)
// 10
let indexPaths = (lastItem..<self.photos.count).map { NSIndexPath(forItem: [=14=], inSection: 0) }
// 11
dispatch_async(dispatch_get_main_queue()) {
self.collectionView!.insertItemsAtIndexPaths(indexPaths)
}
self.currentPage++
}
}
self.populatingPhotos = false
} }
Xcode 不能相信它在 Swift 中出错的原因,但你可以相信它指出了正确的位置:)
CLLocationCoordinate2dMake() as! Float
会产生错误。因为您不能将结构转换为数字。
删除 as! Float
,您的错误就会消失。