无法将“x”类型的值转换为预期的参数类型“[String : Any]”

Jac*_*ley 1 ios firebase swift google-cloud-firestore

我目前正在尝试使用 Swift 5 中的 Firestore 创建用户数据库。

我创建了一个注册视图控制器,我正在关注 Firestore 文档(此链接),以便存储用户数据。


在常量文件中,我存储了以下代码。

struct userMap: Codable {
    let firstName: String?
    let lastName: String?
    let email: String?
    let profilePictureURL: String?
    let UserIdentification: String?

    enum CodingKeys: String, CodingKey {
        case firstName
        case lastName
        case email
        case profilePictureURL
        case UserIdentification
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的注册视图控制器中,我有这个代码。

let user = Constants.userMap(firstName: firstName,
                             lastName: lastName,
                             email: email,
                             profilePictureURL: metaImageURL,
                             UserIdentification: docRefID)

do {
    try dbRef.document(docRefID).setData(user)
} catch let error {
    print("Error writing to Firestore: \(error)")
}
Run Code Online (Sandbox Code Playgroud)

try dbRef.document(docRefID).setData(user)我收到错误消息时,“无法将类型 'Constants.userMap' 的值转换为预期的参数类型 '[String : Any]'”

我觉得值得补充的东西。在 firebase 文档中,它推荐了以下内容。

try dbRef.document(docRefID).setData(from: user)
Run Code Online (Sandbox Code Playgroud)

但是,我试过这个,这个也试过了,我只是被要求删除from:.

感谢你的帮助。

Bib*_*cob 5

您正在使用结构的对象userMap而不是字典。您可以通过在userMap结构中创建一个字典并提供该字典作为参数来解决这个问题。由于您的结构已经符合Codable您可以DatauserMapusing 的对象创建JSONEncoder。然后,您可以将数据转换为 JSON 字典以用作参数。这里的代码:

struct userMap: Codable {
    //...
    var dictionary: [String: Any] {
        let data = (try? JSONEncoder().encode(self)) ?? Data()
        return (try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any]) ?? [:]
    }
}
Run Code Online (Sandbox Code Playgroud)

而对于setData

try dbRef.document(docRefID).setData(from: user.dictionary)
Run Code Online (Sandbox Code Playgroud)

注意:主要结构名称大写以保持一致性 因此,转换userMapUserMap.