键入'任何'没有下标成员

时间:2016-10-06 18:27:52

标签: swift swift3

let employerName = snapshot.value! ["employerName"] as! String
let employerImage = snapshot.value! ["employerImage"] as! String
let uid = snapshot.value! ["uid"] as! String

我查看过以前的帖子,但似乎无法找到解决此问题的方法。所有三行代码都给出了"类型'任何'没有下标成员"错误。相当新的,所以任何帮助都表示赞赏。

2 个答案:

答案 0 :(得分:1)

snapshot.value的类型为Any。下标是一种特殊的函数,它使用括号中的值括起来的语法。此下标函数由Dictionary实现。

所以这里发生的事情是你作为开发人员知道snapshot.valueDictionary,但编译器没有。它不会让您调用subscript函数,因为您尝试使用Any类型的值调用它,而Any未实现subscript。为此,您必须告诉编译器您的snapshot.value实际上是Dictionary。更多Dictionary允许您使用带有Dictionary键的任何类型值的下标函数。因此,您需要告诉它您的Dictionary密钥为String(AKA [String: Any])。更进一步,在你的情况下,你似乎知道Dictionary中的所有值都是String,所以不要在将每个值下标到{{1}之后}使用String,如果您只是告诉它as! String的键和值都是Dictionary类型(AKA String),那么您将可以下标到访问值,编译器也会知道值[String: String]

String

你有它!

答案 1 :(得分:0)

由于您希望将snapshot.value视为未打包的字典,请尝试转换为1,如果成功,则使用该字典。

考虑类似的事情:

func findElements(candidate: Any) {
    if let dict: [String : String] = candidate as? Dictionary {
        print(dict["employerName"])
        print(dict["employerImage"])
        print(dict["uid"])
    }
}

// Fake call    
let snapshotValue = ["employerName" : "name", "employerImage" : "image", "uid" : "345"]
findElements(snapshotValue)