繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM