Firebase Swift 3.0语法更新?

我有一个Firebase支持的iOS应用程序一直运行良好,直到我将Xcode升级到Xcode 8.现在错误显示在以下行中:

let state = child.value!["STATE"] as! String // Was correct in Swift 2.3

Swift 3.0中的错误: Value of type 'NSFastEnumerationIterator.Element' (aka 'Any') has no member 'value'

将我的代码转换为Swift 3.0后,更改将语法转换为:

let name = (child as AnyObject).value!["NAME"] as! String

但是这会返回此错误:

Type 'NSFastEnumerationIterator.Element' (aka 'Any') does not conform to protocol 'AnyObject'

此外,我收到此错误:当我尝试访问快照值时The Type 'Any' has no subscript members

Swift 3.0的Firebase文档没有改变,那么这里的问题是什么?

完整代码块:

  self.firebase.child(“INFO”).observeSingleEvent(of: .value, with: { (snap: FIRDataSnapshot) in for child in snap.children{ if child.hasChild("NAME") && child.hasChild("ZIP-CODE") && child.hasChild("STATE"){ let name = child.value!["NAME"] as! String let zip = child.value!["ZIP-CODE"] as! String let state = child.value!["STATE"] as! String } } }) 

感谢您的帮助,非常感谢!

我猜你没有将你检索到的Snapshot从一个事件转换成任何类型,这可能导致Xcode对这个Snapshot甚至属于哪种类型感到困惑?

  FIRDatabase.database().reference().observeSingleEvent(of : .value, with : {(Snapshot) in if let snapDict = Snapshot.value as? [String:AnyObject]{ for child in snapDict{ if let name = child.value["NAME"] as? String{ print(name) } if let zip = child.value["ZIP-CODE"] as? String{ print(zip) } if let state = child.value["STATE"] as? String{ print(state) } } } }) 

您是否尝试将child.value转换为NSDictionary? 我已成功投射我的火力基础快照并按以下方式访问其值(根据您的情况调整)。

 self.firebase.child(“INFO”).observeSingleEvent(of: .value, with: { (snap: FIRDataSnapshot) in for child in snap.children{ let childValue = child.value as? NSDictionary if child.hasChild("NAME") && child.hasChild("ZIP-CODE") && child.hasChild("STATE"){ let name = childValue!["NAME"] as! String let zip = childValue!["ZIP-CODE"] as! String let state = childValue!["STATE"] as! String } } }) 

我们遇到了类似的问题,由于某种原因,不得不将子FIRDataSnapshot重新命名为DataSnapshot (从FIRDataSnapshot重命名)。

所以这样的事情:

  query.observeSingleEvent(of: .value, with: { (snapshot) in for childSnapshot in snapshot.children { if let childSnapshot = childSnapshot as? DataSnapshot, let data = childSnapshot.value // Do stuff with data } } })