键入' String'不符合协议' NSCopying'与NSDictionary

时间:2014-12-23 10:53:43

标签: xcode google-maps swift google-maps-api-3

我尝试使用Swift在Xcode中使用Google Geolocation api,以允许将文本地址转换为纬度和经度。

http://maps.googleapis.com/maps/api/geocode/json?address=washington%20dc是一个示例JSON调用。

错误:键入'字符串'不确认协议' NSCopying' ,在尝试访问结果词典中的元素时出现。

@IBAction func submitButtonPressed(sender: AnyObject) {
    var address = addAddressTextField.text
    var escapedAddress = address.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
    let urlpath = "http://maps.googleapis.com/maps/api/geocode/json?address=" + escapedAddress!
    println(urlpath)

    let url = NSURL(string: urlpath)!


    let urlSession = NSURLSession.sharedSession()

    let jsonQuery = urlSession.dataTaskWithURL(url, completionHandler: { (data, responce, error) -> Void in

        if error != nil{
            println("there is an error")
        }

        var err : NSError?

        var results = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary

        if err != nil{
            println("there is a second error")
        }

        let formattedAddress: AnyObject! = results["results"]![0]!["formatted_address"]!
        let latitude: AnyObject! = results["results"]![0]!["geometry"]!["location"]!["lat"]!
        let longitude: AnyObject! = results["results"]![0]!["geometry"]!["location"]!["lng"]!

        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            self.fullAddressLabel.text = "\(formattedAddress)"
            self.latLabel.text = "\(latitude)"
            self.longLabel.text = "\(longitude)"

        })

    })

    jsonQuery.resume()
}

错误仅发生在以下行:

let latitude: AnyObject! = results["results"]![0]!["geometry"]!["location"]!["lat"]!
let longitude: AnyObject! = results["results"]![0]!["geometry"]!["location"]!["lng"]!

和let formattedAddress:AnyObject! = ...线条完美无缺。

我尝试将变量定义为字符串和NSStrings,并使用' ...作为字符串'在定义内,但没有运气。

2 个答案:

答案 0 :(得分:0)

问题不是返回的变量而是键。 NSDictionary期望其键符合NSCopying,并且可能是Swift字符串文字不符合results0

我会尝试通过不尝试将整个事情放在一行中来确切地找出导致问题的访问权限(如果您得到意外的响应,您的程序将崩溃,因为您假设所有字典中都存在所有键)。

假设您知道自己至少有一个结果并且已将其放入名为var latitude: Double? var longitude: Double? if let geometry = results0["geometry"] as? NSDictionary { if let location = geometry["location"] as? NSDictionary { latitude = location["lat"] as? Double longitude = location["lon"] as? Double } } 的变量中(这来自外部数据所以您必须检查),我这样做

{{1}}

要么在访问字典的其中一行上出现相同的错误,要么其他可能出错。您可能不得不为了正确的方法而捣乱(我甚至没有尝试编译上面的代码)。但关键是现在代码分散在几行上,隔离错误要容易得多。

答案 1 :(得分:0)

我遇到与json相同的问题试试这个

let latitude = results["results"]![0]!["geometry"]!!["location"]!!["lat"]!! as String
let longitude = results["results"]![0]!["geometry"]!!["location"]!!["lng"]!! as String

请注意,如果您要更新的标签是标准标签,则根本不包括任何错误检查

mylabel.stringValue = latitude

或类似的东西:P

这是我如何在没有错误检查的情况下对我的json对象进行短语的直接复制

var FilePath = object["main"]![row]!["Paths:"]!!["FilePath:"]!! as String