gpt4 book ai didi

ios - 要求字典包含某些值(Swift)

转载 作者:行者123 更新时间:2023-11-28 07:36:05 25 4
gpt4 key购买 nike

我正在创建一个用于将用户数据保存到 Firestore 数据库的模型,并使用字典对其进行初始化。根据我要更新的字段,我将这些值放入字典中,以便用户模型只包含某些字段,因此只会更新我的数据库中的那些字段。但是,我想以某种方式要求在某些用例中提供某些字段。

* 下面的例子是我正在尝试做的一个非常简化的版本 *例如:如果我要保存一个新用户,我想确保我包含了姓名、个人资料图片和描述。但是如果我只是想更新一个字段,那么我不想要求包含所有这些字段

我 99% 确定我以错误的方式攻击这个问题,因此感谢任何帮助。

我当前的用户模型:

struct FirestoreUser {
var id: String
var name: String?
var profileImage: String?

var dictionary: [String: Any]

init(dictionary: [String: Any]) {
self.id = dictionary["id"] as! String
self.name = dictionary["name"] as? String
self.profileImage = dictionary["profileImage"] as? String

self.dictionary = dictionary
}
}

// MARK: Firestore functions
extension FirestoreUser {
typealias Handler = ((Error?) -> Void)?
func saveNewFirestoreUser(then handler: Handler = nil) {
// make sure all necessary variables are set
// if they aren't all set, something went wrong
guard let _ = name, let _ = profileImage else { return }

let firestore = Firestore.firestore()
let ref = firestore.collection("users").document(id)

ref.setData(dictionary) { (error) in
if let error = error {
handler?(error)
}
handler?(nil)
}
}
}

最佳答案

构造具有可选值的结构,并将 nil 作为您不想更新的参数传递。稍后您可以使用以下扩展将结构转换为字典。

struct FirestoreUser: Codable {
var id: String
var name: String?
var profileImage: String?
}


extension Encodable {
var dictionary: [String: Any]? {
guard let data = try? JSONEncoder().encode(self) else { return nil }
return (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)).flatMap { $0 as? [String: Any] }
}
}

使用 -

let test = FirestoreUser(id: "01", name: "Abhinav", profileImage: nil)
print(test.dictionary)

输出-

["name": Abhinav, "id": 01]

关于ios - 要求字典包含某些值(Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53148571/

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