【问题标题】:Firebase Swift 3.0 Syntax Update?Firebase Swift 3.0 语法更新?
【发布时间】: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

                }
            }

        })

感谢大家的帮助,不胜感激!

【问题讨论】:

    标签: ios firebase firebase-realtime-database swift3


    【解决方案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
                  }
              }
          })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-19
        • 1970-01-01
        • 2022-10-06
        • 2017-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        相关资源
        最近更新 更多