将Firebase快照投射到Swift 3对象
我正在从Firebase DB检索对象,需要将它们转换为自定义结构类对象 类别:将Firebase快照投射到Swift 3对象,firebase,swift3,firebase-realtime-database,Firebase,Swift3,Firebase Realtime Database,我正在从Firebase DB检索对象,需要将它们转换为自定义结构类对象 类别: struct Request { var Address: String! var Position: Position! var RequestID: String! var Status: String! } self.ref.child("requests").observe(.childAdded, with: { snapshot in //I need to
struct Request {
var Address: String!
var Position: Position!
var RequestID: String!
var Status: String!
}
self.ref.child("requests").observe(.childAdded, with: { snapshot in
//I need to cast this snapshot object to a new Request object here
let dataChange = snapshot.value as? [String:AnyObject]
print(dataChange)
})
从我的Firebase DB获取快照的函数:
struct Request {
var Address: String!
var Position: Position!
var RequestID: String!
var Status: String!
}
self.ref.child("requests").observe(.childAdded, with: { snapshot in
//I need to cast this snapshot object to a new Request object here
let dataChange = snapshot.value as? [String:AnyObject]
print(dataChange)
})
我怎样才能做到这一点呢?有几件事。Firebase没有对象——它是一个JSON结构。当您这样获得snapshot.value时:
let dataChange = snapshot.value as? [String:AnyObject]
[String:AnyObject]将数据定义为字典
然后可以像这样访问dataChange中的key:value对
let address = dataChange["address"]
及
从那里,您可以创建新对象并在闭包中填充它们(例如,将它们添加到数组中),或者在对象中添加更多智能并传递字典,让对象自行填充
以下是伪代码,但给出了过程:
//create the object and populate it 'manually'
self.ref.child("requests").observe(.childAdded, with: { snapshot in
let dataChange = snapshot.value as? [String:AnyObject]
let aRequest = Request()
aRequest.address = dataChange["address"]
aRequest.position = dataChange["position"]
self.requestArray.append(aRequest)
})
或
有几件事。Firebase没有对象——它是一个JSON结构。当您这样获得snapshot.value时:
let dataChange = snapshot.value as? [String:AnyObject]
[String:AnyObject]将数据定义为字典
然后可以像这样访问dataChange中的key:value对
let address = dataChange["address"]
及
从那里,您可以创建新对象并在闭包中填充它们(例如,将它们添加到数组中),或者在对象中添加更多智能并传递字典,让对象自行填充
以下是伪代码,但给出了过程:
//create the object and populate it 'manually'
self.ref.child("requests").observe(.childAdded, with: { snapshot in
let dataChange = snapshot.value as? [String:AnyObject]
let aRequest = Request()
aRequest.address = dataChange["address"]
aRequest.position = dataChange["position"]
self.requestArray.append(aRequest)
})
或
如果您的结构有很多字段,那么这样做比较容易(Swift 4+):
如果您的结构有很多字段,那么这样做比较容易(Swift 4+):
看看这个关于这个主题的极好答案。。。看看这个关于这个主题的极好答案。。。谢谢你精彩的解释!然而,我遇到了一个奇怪的问题。当我通过以下行执行时:
let address=dataChange[“address”]”,它崩溃了,因为值“address”实际上被读取为**address**。在这种情况下,我尝试了:
let address=dataChange[“address”]。一切都很顺利,直到它突然开始读它为let
address=dataChange[“address”]`。为什么它一直在更改JSON值的大小写?@RickGrimesLikesWalkerSoup,它与您的Firebase结构直接相关。我猜你可能会有一些键被标记为“地址”,而另一些键被标记为“地址”——它们必须是一致的。通过使用and if let address=dataChange[“address”]技术可以避免崩溃,但最终数据(键名)应该是一致的。我检查了它是否为零,如果是,我更改了资本化,然后再次检查。无论如何,谢谢你,杰。你的解决方案有效谢谢你精彩的解释!然而,我遇到了一个奇怪的问题。当我通过以下行执行时:let address=dataChange[“address”]”,它崩溃了,因为值“address”实际上被读取为**address**。在这种情况下,我尝试了:
let address=dataChange[“address”]。一切都很顺利,直到它突然开始读它为let
address=dataChange[“address”]`。为什么它一直在更改JSON值的大小写?@RickGrimesLikesWalkerSoup,它与您的Firebase结构直接相关。我猜你可能会有一些键被标记为“地址”,而另一些键被标记为“地址”——它们必须是一致的。通过使用and if let address=dataChange[“address”]技术可以避免崩溃,但最终数据(键名)应该是一致的。我检查了它是否为零,如果是,我更改了资本化,然后再次检查。无论如何,谢谢你,杰。你的解决方案有效