types'Any'在更新到Swift 3后没有下标成员
这是我在Swift中的代码:
currentUserFirebaseReference.observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in let UID = snapshot.key let pictureURL = snapshot.value!["pictureURL"] as! String let name = snapshot.value!["displayname"] as! String let currentUser = Person(name: name, bio: "", UID: UID, pictureURL: pictureURL) self.currentUserInfo = currentUser })
我刚更新到Xcode 8 / Swift 3,这似乎导致了以下错误信息:
“types”任何“没有下标成员”
我在代码中的很多地方调用snapshot.value!["
在这里插入东西"]
,我得到这个错误,我不能运行我的代码。
以下代码工作:
let pic = (snapshot.value as? NSDictionary)?["pictureURL"] as? String ?? ""
但是,我不知道现在发生了什么变化或是什么使得这一点成为必要,而与之前的情况不同。
我所知道的唯一变化就是观察的语法,但我不明白为什么这会导致我的代码停止工作。
在FIRDataSnapshot中 , value
的types为id
。
在Swift 3中 , id
被导入为Any
。
在Firebase文档中,它表示value
可以是NSDictionary
, NSArray
, NSNumber
或NSString
任何一个,显然,下标对所有这些都没有意义,特别是在Swift中。 如果你知道这是一个NSDictionary
在你的情况下,那么你应该把它。
J. Cocoe的答案是绝对正确的,但对于那些需要代码示例的人来说,这是你的方式:
代替
let name = snapshot.value!["displayname"] as! String
尝试
let snapshotValue = snapshot.value as? NSDictionary let name = snapshotValue["displayName"] as? String
这个想法是,你需要将任何types的snapshot.value转换为NSDictionary。
编辑:
正如Connor所指出的那样,由于可能收到意外的信息,强制解开snapshot.value或后端系统中的任何东西是一个坏主意。 所以你改变为! NSDictionary为? 的NSDictionary。