2016-09-23 115 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 
      } 
     } 
    })