无法将类型“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
,您可以使用JSONEncoder
从userMap
的对象创建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”