gpt4 book ai didi

xcode - 类型 'String' 不确认协议(protocol) 'NSCopying' 与 NSDictionary

转载 作者:行者123 更新时间:2023-11-28 09:16:03 24 4
gpt4 key购买 nike

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

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

错误:Type 'String' does not confirm to protocol '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! = ... 线路完美运行。

我曾尝试将变量定义为字符串和 NSString,并在定义中使用“...作为字符串”,但没有成功。

最佳答案

问题不在于返回的变量,而在于键。 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
}
}

要么您会在访问字典的某一行中遇到相同的错误,要么其他地方可能出错。您可能还需要摆弄转换才能使其正确(我什至没有尝试编译上面的代码)。但重点是,现在代码分布在多行中,应该更容易隔离错误。

关于xcode - 类型 'String' 不确认协议(protocol) 'NSCopying' 与 NSDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27618896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com