将Firebase快照投射到Swift 3对象

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)

我该怎么做?

Iva*_*iuk 6

如果你的结构体有很多字段,这样做会更容易(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)


Jay*_*Jay 5

有几件事。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)