gpt4 book ai didi

ios - 错误 : 'Cannot call value of non-function type' on Swift 3

转载 作者:可可西里 更新时间:2023-11-01 00:58:26 36 4
gpt4 key购买 nike

以下代码的第二行和第三行适用于 swift 2.3,自从我更新到 swift 3 后,我一直收到错误消息无法调用非函数类型的值 'Any?!' 对于他们两个:

let dic = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableLeaves) as! NSDictionary                    

let lat = ((((dic["results"] as AnyObject).value(forKey: "geometry") as AnyObject).value(forKey: "location") as AnyObject).value(forKey: "lat") as AnyObject).object(0) as! Double
let lon = ((((dic["results"] as AnyObject).value(forKey: "geometry") as AnyObject).value(forKey: "location") as AnyObject).value(forKey: "lng") as AnyObject).object(0) as! Double

self.delegate.locateWithLongitude(lon, andLatitude: lat, andTitle: self.searchResults[(indexPath as NSIndexPath).row])

这是谷歌地图搜索的回调。

该方法正在读取的 JSON 是这样的:

{
"results" : [
{
"address_components" : [
{
"long_name" : "São Paulo",
"short_name" : "São Paulo",
"types" : [ "locality", "political" ]
},
{
"long_name" : "São Paulo",
"short_name" : "São Paulo",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "State of São Paulo",
"short_name" : "SP",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "Brazil",
"short_name" : "BR",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "São Paulo, State of São Paulo, Brazil",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : -23.3566039,
"lng" : -46.36508449999999
},
"southwest" : {
"lat" : -24.0082209,
"lng" : -46.825514
}
},
"location" : {
"lat" : -23.5505199,
"lng" : -46.63330939999999
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : -23.3566039,
"lng" : -46.36508449999999
},
"southwest" : {
"lat" : -24.0082209,
"lng" : -46.825514
}
}
},
"partial_match" : true,
"place_id" : "ChIJ0WGkg4FEzpQRrlsz_whLqZs",
"types" : [ "locality", "political" ]
}
],
"status" : "OK"
}

有谁知道我做了什么改变才能让它发挥作用?

最佳答案

在解析 JSON 时,Swift 中有一些非常糟糕的事情:

  • 转换为没有类型信息的 NSDictionaryNSArray
  • 转换为非常不确定的 AnyObject
  • valueForKey,这是一种键值编码方法,在这种情况下不是必需的。
  • mutableleaves 选项在使用 Swift 类型时毫无意义,在只读取对象时从不需要。

起诉所有暗示不良编程习惯的教程。 ;-)

请考虑 AnyObject 在 Swift 3 中已被替换为 Any

JSON 仅支持两种集合类型,array – 由 [] 表示 – 和 dictionary – 由 {} 表示.

要可靠地解析 JSON,您必须仔细阅读 JSON 以识别结构并告诉编译器节点的类型。

您的主要错误是关键 results 的值类型错误,它是一个数组

此代码检查是否存在具有可选绑定(bind)的所有键,以及数组是否不为空以及 location 的字典是否包含 2 个项目:

if let jsonObject = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:Any],
let results = jsonObject["results"] as? [[String:Any]], !results.isEmpty,
let geometry = results[0]["geometry"] as? [String:Any],
let location = geometry["location"] as? [String:Double],
let lat = location["lat"], let lng = location["lng"] {

print("lat: \(lat) - lng: \(lng)")
}

苹果发表综合文章Working with JSON in Swift

关于ios - 错误 : 'Cannot call value of non-function type' on Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39550568/

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