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可以是NSDictionaryNSArrayNSNumberNSString任何一个,显然,下标对所有这些都没有意义,特别是在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。