在NSDictionary

时间:2015-06-20 17:20:54

标签: swift closures nsdictionary

SETUP

  • 我正在使用我的API从我的服务器加载数据
  • 返回的数据是JSON
  • API提供的JSON如下图所示
  • 我使用ALAMOFIRE从API接收数据并解析JSON响应

JSON

{
data: [
{
owner: "FREDL",
street: "Apothekergasse 1",
latitude: "48.261900",
longitude: "11.445200"
}
],
meta: "Testmeta"
}

AED 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. 当我提供结果词典并通过$0["owner"]访问参数时,为什么会出现此错误消息?
  2. 当我使用例如println($0["owner"]时,我得到一个结果,错误就消失了。为什么可以访问?
  3. 更新

    我改变了问题功能,如上所示。当我将代码分成:

    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函数会返回错误?

    更新2

    我找到了一个关于Ray Wenderlich的例子,他采取了相同的方法。但没有错误。差异在哪里呢?

    // 3   Alamofire.request(Five100px.Router.PopularPhotos(self.currentPage))。responseJSON(){     

    中的(_,_,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({ ($0["nsfw"] as! Bool) == false }).map { PhotoInfo(id: $0["id"] as! Int, url: $0["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: $0, inSection: 0) }
    
        // 11
        dispatch_async(dispatch_get_main_queue()) {
          self.collectionView!.insertItemsAtIndexPaths(indexPaths)
        }
    
        self.currentPage++
      }
    }
    self.populatingPhotos = false
    

    } }

1 个答案:

答案 0 :(得分:1)

Xcode因其在Swift中出错的原因而无法信任,但您可以相信它在正确的位置指出它:)

CLLocationCoordinate2dMake() as! Float会产生错误。因为您无法将结构转换为数字。

删除as! Float,您的错误就会消失。