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

想要使用 Swift 3.0 发送自定义电子邮件,即来自 firebase 的欢迎邮件

火力基地 |远程通知不显示,swift 3.0

Swift 3.0 如何在 Firebase 中的父级上添加子级