一尘不染

遍历Firebase中的快照子级

swift

我有一个Firebase资源,其中包含几个对象,我想使用Swift对其进行迭代。我期望的工作如下(根据Firebase文档)
https://www.firebase.com/docs/ios-
api/Classes/FDataSnapshot.html#//api/name/children

var ref = Firebase(url:MY_FIREBASE_URL)
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
  println(snapshot.childrenCount) // I got the expected number of items
    for rest in snapshot.children { //ERROR: "NSEnumerator" does not have a member named "Generator"
       println(rest.value)     
     }
 })

因此,看来Swift遍历Firebase返回的NSEnumerator对象存在问题。

非常欢迎您提供帮助。


阅读 268

收藏
2020-07-07

共1个答案

一尘不染

如果我没看错文档,这就是您想要的:

var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
    print(snapshot.childrenCount) // I got the expected number of items
    for rest in snapshot.children.allObjects as! [FIRDataSnapshot] {
       print(rest.value)     
    }
}

更好的方法可能是:

var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
    print(snapshot.childrenCount) // I got the expected number of items
    let enumerator = snapshot.children
    while let rest = enumerator.nextObject() as? FIRDataSnapshot {
       print(rest.value)     
    }
}

第一种方法需要NSEnumerator返回所有对象的数组,然后可以按通常方式枚举该对象。第二种方法是一次从获取一个对象,这NSEnumerator可能更有效。

无论哪种情况,要枚举的FIRDataSnapshot对象都是对象,因此您需要进行强制转换,以便可以访问该value属性。


使用for-in循环:

自从Swift 1.2天后写出原始答案以来,该语言就得到了发展。现在可以使用for in直接与枚举器一起使用的循环以及case let分配类型:

var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
    print(snapshot.childrenCount) // I got the expected number of items
    for case let rest as FIRDataSnapshot in snapshot.children {
       print(rest.value)     
    }
}
2020-07-07