Din*_*uka 1 firebase firebase-realtime-database swift3
我正在从Firebase数据库中检索对象,我需要将它们强制转换为自定义结构类对象
类:
struct Request {
var Address: String!
var Position: Position!
var RequestID: String!
var Status: String!
}
Run Code Online (Sandbox Code Playgroud)
从我的Firebase数据库获取快照的函数:
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)
})
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
如果你的结构体有很多字段,这样做会更容易(Swift 4+):
struct Request: Decodable {
var Address: String
var RequestID: String
var Status: String
}
self.ref.child("requests").observe(.childAdded, with: { snapshot in
guard let data = try? JSONSerialization.data(withJSONObject: snapshot.value as Any, options: []) else { return }
let yourStructObject = try? JSONDecoder().decode(Request.self, from: data)
}
Run Code Online (Sandbox Code Playgroud)
有几件事。Firebase没有对象-它是JSON结构。当您获得如下的snapshot.value时:
let dataChange = snapshot.value as? [String:AnyObject]
Run Code Online (Sandbox Code Playgroud)
[String:AnyObject]将数据定义为字典。
然后,您可以像这样访问dataChange中的key:value对
let address = dataChange["address"]
Run Code Online (Sandbox Code Playgroud)
和
let position = dataChange["position"]
Run Code Online (Sandbox Code Playgroud)
从那里,您可以创建新对象并将其填充在闭包中(例如,将它们添加到数组中),也可以在对象中添加更多智能,然后传递字典并让对象自行填充。
以下是伪代码,但它介绍了该过程:
//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)
})
Run Code Online (Sandbox Code Playgroud)
要么
Class Request {
var address = ""
var position = ""
func initWithDict(aDict: [String: AnyObject]) {
self.address = aDict["address"]
self.position = aDict["position"]
}
}
//let the object populate itself.
self.ref.child("requests").observe(.childAdded, with: { snapshot in
let dataChange = snapshot.value as? [String:AnyObject]
let aRequest = Request(initWithDict: dataChange)
self.requestArray.append(aRequest)
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3012 次 |
| 最近记录: |