将Firebase快照投射到Swift 3对象

将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

我正在从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 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”]技术可以避免崩溃,但最终数据(键名)应该是一致的。我检查了它是否为零,如果是,我更改了资本化,然后再次检查。无论如何,谢谢你,杰。你的解决方案有效