为什么我在Swift中遇到此错误“无法找到成员下标”

时间:2015-08-09 08:41:44

标签: swift

我正在尝试使用facebook登录后返回的字典对象结果。结果变量看起来像这样

 result = [ location: ["name": "Paris, France", "id": "34534999333"]  ] 

我的目标是访问位置名称。 我试试这段代码:

 if let location = result["location"]?["name"] as? String {
              //do something      
      }

但是我收到错误“无法找到成员下标”。 我认为代码的逻辑没有错。如果result [“location”]存在,则在其中查找索引“name”,将其转换为字符串,如果成功,则将常量“location”设置为等于它。

我可以用更长的代码做我想做的事,但我只是想了解为什么Swift不理解上面的代码。

3 个答案:

答案 0 :(得分:1)

我怀疑你的问题是result是一个可选类型。 选项 - 点击result变量。如果类型为NSDictionary?或类似[NSObject: AnyObject]?,则result必须先解包,然后才能使用它。我会先尝试一下:

if let location = result?["location"]?["name"] as? String {
    //do something      
}

如果resultAnyObjectAnyObject?,我建议您一步一步:

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)

}

在编写代码行后,按任意键点击任何可疑变量通常会显示结果类型<<错误类型>>每当编译器出现问题时。