2016-09-23 79 views
0

我有一个火力地堡支持的iOS应用,直到我升级的Xcode Xcode的8.现在误差线,如显示已经正常工作:Firebase Swift 3.0语法更新?

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

错误雨燕3.0:Value of type 'NSFastEnumerationIterator.Element' (aka 'Any') has no member 'value'

我的代码转换为雨燕3.0后,情况变了,语法到这一点:

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

但是回报s此错误:当我尝试访问快照值The Type 'Any' has no subscript members

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

此外,我得到这个错误。

对于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

我猜你是不是从事件您铸造检索快照任何类型的,这可能导致Xcode的困惑,什么类型的做到这一点快照甚至属于哪一种?

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) 
       } 
      } 
     } 
    }) 
+0

不幸的是,它并没有解决我的问题。我只是更新了完整的代码 –

+0

无论何时直接在FIRDataSnapshot上调用.value,错误信息如下:'Type'Any'没有下标成员' –

+0

快乐编码! :) –

0

您是否尝试将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 

      } 
     } 

    }) 
0

我们面临着类似的问题,不得不重铸由于某种原因,孩子的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 
      } 
     } 
    })