有没有办法检索子项中的所有键,将它们放入数组,然后检索键的值并将其放入另一个数组?
源代码:
self.ref?.child("data").child("success").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot != nil {
// Your answer goes here
}
}
答案 0 :(得分:20)
快照有两个属性。
snapshot.key
snapshot.value
使用.value的观察者时。所有关键:值子项在快照中返回。可以迭代它们来捕获每个键:这样的值对。
ref.observeSingleEvent(of: .value, with: { (snapshot) in
for child in snapshot.children {
let snap = child as! DataSnapshot
let key = snap.key
let value = snap.value
print("key = \(key) value = \(value!)")
}
})
请记住,value属性可以是字符串,数字,数组或其他字典(快照)。在原始问题中,它是一个字符串。
答案 1 :(得分:5)
我想在我的项目中做类似的事情。希望这会有所帮助,你会明白这个想法
var photosList = [String]()
refToObserve?.observeSingleEvent(of: .value, with: {snapshot in
if let snapshotValue = snapshot.value as? [String:Any] {
for child in snapshot.childSnapshot(forPath: ***your path***).children {
let myChild = child as! DataSnapshot
if let myChildValue = myChild.value as? [String:Any] {
self.photosList.append(myChildValue["postId"] as! String)
}
}
}
})
答案 2 :(得分:4)
这样的事情应该有效(使用更好的命名变量):
snapshot.value
投射为字典.keys
& .values
个属性可将其LazyMapCollection
类型检索。<强>代码:强>
self.ref?
.child("data")
.child("success")
.child(userID!)
.observeSingleEvent(of: .value, with: { (snapshot) in
if let data = snapshot.value as? [String: Any] {
let keys = Array(data.keys)
let values = Array(data.values)
... // Your code here
}
}
更新 - 显示遵守订单的示例:
我可能会将字典保存到一个数组中,然后将其转换为Array<(key: String, value: Any)>
类型。然后,您可以将其映射到键或值并保持顺序。
... // As above
.observeSingleEvent(of: .value, with: { (snapshot) in
if let data = snapshot.value as? [String: Any] {
let dataArray = Array(data)
let keys = dataArray.map { $0.0 }
let values = dataArray.map { $0.1 }
... // Your code here
}
}