gpt4 book ai didi

ios - 将数据从 Firestore 映射到 Swift 中的结构 - IOS

转载 作者:可可西里 更新时间:2023-11-01 00:54:18 25 4
gpt4 key购买 nike

我正在尝试将从我的 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 的映射工具,因为您可能会在不同模型的同一字典中处理不同类型的值。将这个字典与初始化器中的那些变量映射的代码不会很漂亮。

关于ios - 将数据从 Firestore 映射到 Swift 中的结构 - IOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54163961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com