我正在尝试使用facebook登录后返回的字典对象结果。结果变量看起来像这样
result = [ location: ["name": "Paris, France", "id": "34534999333"] ]
我的目标是访问位置名称。 我试试这段代码:
if let location = result["location"]?["name"] as? String {
//do something
}
但是我收到错误“无法找到成员下标”。 我认为代码的逻辑没有错。如果result [“location”]存在,则在其中查找索引“name”,将其转换为字符串,如果成功,则将常量“location”设置为等于它。
我可以用更长的代码做我想做的事,但我只是想了解为什么Swift不理解上面的代码。
答案 0 :(得分:1)
我怀疑你的问题是result
是一个可选类型。 选项 - 点击result
变量。如果类型为NSDictionary?
或类似[NSObject: AnyObject]?
,则result
必须先解包,然后才能使用它。我会先尝试一下:
if let location = result?["location"]?["name"] as? String {
//do something
}
如果result
为AnyObject
或AnyObject?
,我建议您一步一步:
if let dict = result as? NSDictionary {
if let location = dict["location"] as? NSDictionary {
if let name = location["name"] as? String {
// use name
}
}
}
您可以将上述内容压缩为单个if:
if let name = ((result as? NSDictionary)?["location"] as? NSDictionary)?["name"] as? String {
// use name
}
答案 1 :(得分:0)
除了明显的拼写错误(result
赋值中的'位置'肯定应该是字符串文字"location"
?),{{1}中的String
可选向下转换声明是不必要的。 Swift已经推断出类型 - 它知道if let
返回类型result["location"]?["name"]
。
String?
应该产生一个编译器警告,但我不希望它“无法找到成员下标”,除非编译器已经相当困惑(在Swift开发的这个相对早期的阶段已经知道了) !)。首先删除向下转发。
答案 2 :(得分:0)
编译器很困惑。原因是原始中的“location:”看起来像字典赋值,但关键位置看起来也像写入的变量。用引号括起该值使其成为一个独特的字典键将产生所需的Dictionary对象。您可以使用以下语法打开场所信息。
//: Playground - noun: a place where people can play
import UIKit
let result = [ "location": ["name": "Paris, France", "id": "34534999333"] ]
if let place = result["location"]?["name"] {
//do something
print(place)
}
在编写代码行后,按任意键点击任何可疑变量通常会显示结果类型<<错误类型>>每当编译器出现问题时。