[英]Map Data From Firestore to a struct In Swift - IOS
我正在尝试将从 Firestore 数据库中检索到的“用户”映射到我在代码中定义的用户结构,但我认为我没有正确理解 swift 中的映射功能。
如何将检索到的用户映射到结构中?
结构
struct User {
// Properties
var firstName: String
var lastName: String
var userName: String
var email: String
init(firstName: String, lastName: String, userName: String, email: String) {
self.firstName = firstName
self.lastName = lastName
self.userName = userName
self.email = email
}
}
从 Firestore 获取用户的函数
func getUser(UID: String) {
// Firebase setup
settings.areTimestampsInSnapshotsEnabled = true
db.settings = settings
db.collection("users").document(UID).getDocument { (document, error) in
if let error = error {
print("Error: \(error.localizedDescription)")
} else {
print(document!.data()!)
}
}
}
查询的 Firestore 文档的类型为[String: Any]
,因此配置您的初始值设定项以接受这种类型的字典。 因为您正在处理数据库返回,所以永远无法保证数据将完全完整,因此我建议您使初始化程序可失败,这仅意味着它可以返回nil
(它可以失败)。
我以你的例子为例,将email
属性设为可选。 在下面的示例中,实例化User
对象只需要四个属性中的三个。
let info: [String: Any] = ["hasFriends": true]
let firestoreData: [String: Any] = ["firstName": "lance", "lastName": "stevenson", "userName": "lstevenson", "info": info]
struct User {
var firstName: String
var lastName: String
var userName: String
var info: [String: Any]
var email: String?
var hasFriends: Bool
init?(data: [String: Any]) {
guard let firstName = data["firstName"] as? String,
let lastName = data["lastName"] as? String,
let userName = data["userName"] as? String,
let info = data["info"] as? [String: Any],
let hasFriends = info["hasFriends"] as? Bool else {
return nil
}
self.firstName = firstName
self.lastName = lastName
self.userName = userName
self.info = info
self.hasFriends = hasFriends
self.email = data["email"] as? String // User will be created even if this is nil
}
}
if let user = User(data: firestoreData) {
print(user.hasFriends) // true
}
我不建议您为此使用 Swift 的映射工具,因为您可能会在同一字典中为不同模型处理不同类型的值。 并且将这个字典与初始化程序中的这些变量进行映射的代码不会很漂亮。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.