无法投射类型' __ NSCFArray'来自NSDictionary' +在地图视图中显示注释

时间:2015-11-05 23:59:55

标签: ios json swift parsing alamofire

我真的需要帮助解决我在尝试解析看起来像这样的JSON时遇到的问题: http://imgur.com/t39nUSv 它是一个阵列' []'在字典中,每个字典都有两个键/值对,如图所示。 这是我的代码,我不知道为什么它会在线崩溃

for location in JSON as! Dictionary<String, AnyObject>

以下是导致其崩溃的代码

func populateMapObjects() {

    if populatingMapObjects {
        return
    }

    populatingMapObjects = true

    self.loadingIndicator.startAnimating()

    Alamofire.request(GWNetworking.Router.MapObjects).responseJSON() { response in
        if let JSON = response.result.value {

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)) {

                if (JSON .isKindOfClass(NSArray)) {


                    for location in JSON as! Dictionary<String,AnyObject> {

                        if let issueLocation: IssueLocation = IssueLocation(locationName: "Center of the universe", campusName: "Queen's University", latitude: 44.22661586877309, longitude: -76.49380087852478, coordinate: CLLocationCoordinate2D(latitude: 44.22661586877309, longitude: -76.49380087852478)) {

                            var index = 0

                            if let locationName = JSON[index]["name"] as? String {
                                issueLocation.locationName = locationName
                            }

                            print(issueLocation.locationName)

                            if let latitude = JSON[index]["coordinates"]!![1] as? Double {
                                issueLocation.latitude = latitude
                            }

                            if let longitude = JSON[index]["coordinates"]!![0] as? Double {
                                issueLocation.longitude = longitude
                            }

                            issueLocation.coordinate = CLLocationCoordinate2D(latitude: issueLocation.latitude, longitude: issueLocation.longitude)

                            index++

                            self.mapObjects.addObject(issueLocation)
                    }
                }
            }

                dispatch_async(dispatch_get_main_queue()) {

                    self.loadingIndicator.stopAnimating()
                    self.populatingMapObjects = false
            }
        }
    }
}
}

我是否应该考虑每个&#34;层&#34;我真的很困惑。 JSON作为数组或字典,如果它应该是NSDictionary,Dictionary ..如果我应该使用索引或valueForKey ....我迷失了。有人请告诉我如何修复这个bug。 我对应用的其他部分使用相同的API,但此视图特别是获得了看起来不同的JSON,这就是我无法让代码工作的原因。

编辑1:将注释添加到地图视图的代码。

    func loadObjectsIntoMapView() {

    for mapObject in mapObjects {

        let temporaryMapAnnotation = IssueLocation(locationName: mapObject.locationName, campusName: "Main Campus", latitude: mapObject.latitude, longitude: mapObject.longitude, coordinate: mapObject.coordinate)

        if (temporaryMapAnnotation.longitude < -76.50921821594238) {
            temporaryMapAnnotation.campusName = "West Campus"
        }

        self.mapView.addAnnotation(temporaryMapAnnotation)
    }

}

2 个答案:

答案 0 :(得分:4)

您的JSON是一个字典数组。你的问题就在这一行:

for location in JSON as! Dictionary<String,AnyObject> {

这应该是:

for location in JSON as! [Dictionary<String,AnyObject>] {

也可以写成:

for location in JSON as! [[String: AnyObject]] {

本案例中的演员表适用于JSON;您没有强制转换从JSON数组中检索的对象。

执行此操作时,location的类型为Dictionary<String,AnyObject>(也称为[String: AnyObject])。

答案 1 :(得分:2)

我自己还在学习Swift的细节。

我的猜测是在这句话中:

for location in JSON as! Dictionary<String,AnyObject>

运算符优先级为:

for location in (JSON as! Dictionary<String,AnyObject>)

哪会迫使JSON成为字典,然后尝试对其内容进行for循环。

对我来说,你想要的是这样的:

let arrayOfDictionaries = JSON as! [Dictionary<String,AnyObject>]
for location in arrayOfDictionaries

这应该将您的JSON对象强制转换为具有特定类型的变量(类型为Dictionary<String,AnyObject>的字典数组,然后在该数组中执行for循环。