在 NSDictionary 上使用地图

Using map on NSDictionary

设置

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 '((_) -> _)'

问题

  1. 因为我提供了一个结果字典并且我通过 [=18=]["owner"] 访问了参数,为什么会出现这个错误消息?
  2. 例如,当我使用 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,您的错误就会消失。