Firebase Swift 3.0 语法更新?
Posted
技术标签:
【中文标题】Firebase Swift 3.0 语法更新?【英文标题】:Firebase Swift 3.0 Syntax Update? 【发布时间】:2016-09-23 18:51:54 【问题描述】:在我将 Xcode 升级到 Xcode 8 之前,我有一个由 Firebase 支持的 ios 应用程序,它一直运行良好。现在错误显示在以下行中:
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
)
感谢大家的帮助,不胜感激!
【问题讨论】:
【参考方案1】:我猜你没有将检索到的 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)
)
【讨论】:
不幸的是,它没有解决我的问题。我刚刚为你更新了完整的代码 当直接在 FIRDataSnapshot 上调用 .value 时,错误显示为:Type 'Any' has no subscript members
【参考方案2】:
您是否尝试过将 child.value 转换为 NSDictionary?我已经成功地投射了我的 firebase 快照并通过以下方式访问它们的值(适应您的情况)。
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
)
【讨论】:
【参考方案3】:我们遇到了类似的问题,由于某种原因,我们不得不将孩子们重铸为 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
)
【讨论】:
以上是关于Firebase Swift 3.0 语法更新?的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 与 Swift 3.0 UITableView
Swift 3.0,Firebase:如何获取最后添加的记录
如何安装 Firebase Crashlytics Swift 3.0