【问题标题】:Type 'Any' has no subscript members after updating to Swift 3更新到 Swift 3 后,类型 'Any' 没有下标成员
【发布时间】:2017-01-21 15:39:33
【问题描述】:

这是我在 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,似乎导致了以下错误信息:

“类型 'Any' 没有下标成员”

我在代码的很多地方都调用了snapshot.value!["insert something here"],我收到了这个错误,我无法运行我的代码。

以下代码有效:

let pic = (snapshot.value as? NSDictionary)?["pictureURL"] as? String ?? ""

但是,与以前相比,我看不出现在发生了什么变化,或者是什么使这变得必要。

据我所知,唯一改变的是观察的语法,但我不明白为什么这会导致我的代码停止工作。

【问题讨论】:

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

J。 Cocoe 的回答是绝对正确的,但是对于那些需要代码示例的人来说,这就是你的做法:

而不是

let name = snapshot.value!["displayname"] as! String

试试

let snapshotValue = snapshot.value as? NSDictionary
let name = snapshotValue["displayName"] as? String

这个想法是您需要将 snapshot.value 的类型从 Any 转换为 NSDictionary。

编辑:

正如 Connor 所指出的,强制解开 snapshot.value 或来自后端系统的任何内容是一个坏主意,因为可能会收到意外信息。所以你变了! NSDictionary 为? NSDictionary。

【讨论】:

  • 特别是与像 Firebase 这样的后端通信时,我建议不要强制展开,以防该值不是您所期望的并且您不希望您的应用程序崩溃:if let snapshotValue = snapshot.value as? NSDictionary, name = snapshotValue["displayName"] as? String { \\ do stuff }
  • 请不要在 Swift 中使用NSDictionary,除非你别无选择。本地字典 [String:Any] 类型更可取,因为它提供类型信息。
【解决方案2】:

FIRDataSnapshot 中,value 的类型为id

Swift 3 中,id 被导入为Any

在 Firebase 文档中,它说 value 可以是 NSDictionaryNSArrayNSNumberNSString 中的任何一个——显然,下标对所有这些都没有意义,尤其是在迅速。如果您知道在您的情况下它是 NSDictionary,那么您应该将其转换为那个。

【讨论】:

  • 你能举个例子吗?
  • 举个例子?
  • 转换。我尝试了 Hibernia 的代码,它运行良好。不过,我想举一个关于你所说的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多