我尝试使用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,并使用' ...作为字符串'在定义内,但没有运气。
答案 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