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

Posted

技术标签:

【中文标题】无法将类型“x”的值转换为预期的参数类型“[String:Any]”【英文标题】:Cannot convert value of type 'x' to expected argument type '[String : Any]' 【发布时间】:2020-06-08 20:34:31 【问题描述】:

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

我创建了一个注册视图控制器,并遵循 Firestore 文档 (this link) 来存储用户数据。


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

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
    

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

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)")

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

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

try dbRef.document(docRefID).setData(from: user)

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

感谢大家的帮助。

【问题讨论】:

【参考方案1】:

您正在使用结构 userMap 的对象,而不是使用字典。您可以通过在 userMap 结构中创建字典并将该字典作为参数提供来解决此问题。由于您的结构已经符合Codable,您可以使用JSONEncoderuserMap 的对象创建Data。然后,您可以将数据转换为 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]) ?? [:]
    

对于setData

try dbRef.document(docRefID).setData(from: user.dictionary)

注意:主要结构名称大写以保持一致性因此,将userMap 转换为UserMap

【讨论】:

太棒了!谢谢你。所以我理解这一点是正确的。这是我对该代码的理解:您正在获取一个对象,并将其转换为 JSON(我应该这样做以保持轻量级),然后获取该 JSON 数据并使用 .mutipleContainers 将其拆分为数组类型?我知道这可能过于简单化了,但我是否同意这一点? 我在我的回答中添加了一些解释,看看。而且不是mutipleContainers,而是mutableContainers,这是子对象的读取选项,仅表示该对象是可变的。 struct UserMap: Codable var dictionary: [String: Any] guard let data = try? JSONEncoder().encode(self) else return [:] return (try? JSONSerialization.jsonObject(with: data) as? [String: Any]) ?? [:] ` 你需要通过字典try dbRef.document(docRefID).setData(user.dictionary)【参考方案2】:

作为参考,有人可能会看到以下错误的另一个原因:

Cannot convert value of type 'x' to expected argument type '[String : Any]'

使用 Firestore 的 setData 命令是因为他们没有添加该行:

import FirebaseFirestoreSwift

【讨论】:

以上是关于无法将类型“x”的值转换为预期的参数类型“[String:Any]”的主要内容,如果未能解决你的问题,请参考以下文章

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

无法将类型“()”的值转换为预期的参数类型“字符串”

无法将“字符串”类型的值转换为预期的参数类型 [任何]

Swift:无法将“NSDate”类型的值转换为预期的参数类型“NSDateComponents”

无法将“()”类型的值转换为预期的参数类型“(() -> Void)?”在 swiftui

无法将类型 '(Any) -> ()' 的值转换为预期的参数类型 '(_) -> _'