以下代码一旦正常工作,我就可以将多个值保存到Firebase记录中。但是,自升级到Swift 3(Xcode 8)以来,这已不再适用。我现在收到以下错误:
*** Terminating app due to uncaught exception 'InvalidFirebaseData', reason: '(setValue:) Cannot store object of type _SwiftValue at mood. Can only store objects of type NSNumber, NSString, NSDictionary, and NSArray.'
上面的错误总是会提到第二个值,无论它是什么类型(即使它是NSString支持的类型之一)。这就是我所拥有的:
postsRef.childByAutoId().setValue(["postedBy": self.currentUser?.uid, "mood": mood, "status": status, "date": convertedDate])
这似乎仍然符合Firebase网站上的文档。我做错了什么?
谢谢!
答案 0 :(得分:0)
尝试: -
let toBePosted = ["postedBy": String(self.currentUser!.uid),
"mood": String(mood), "status": String(status),
"date": String(convertedDate)]
postsRef.childByAutoId().setValue(toBePosted){ (error, ref) -> Void in
}
对于转换日期,您必须在检索时将其转换为NSDate格式。
答案 1 :(得分:0)
我刚刚遇到这个问题,经过几个小时的玩弄后,我想我已经找到了解决方案。
看起来Firebase希望您对使用Swift 3的数据类型非常具体。
你需要直接告诉Swift你将会拥有什么样的词典。在这种情况下,它可能是
let toBePosted : Dictionary<String, Any> = ["postedBy": String(self.currentUser!.uid),
"mood": String(mood), "status": String(status),
"date": String(convertedDate)]
&#34;任何&#34;我认为是Swift 3中的新东西。 AnyObject在这里不起作用,因为Swift重新定义了AnyObjects,而Strings / Ints似乎不再是它们了。
最后,似乎就像你必须在字典中完全没有选项一样。也许一个可选的_SwiftValue?一旦我摆脱了选择权并且贪得无厌,每个价值都将在那里开始为我工作。
这对我有用,请告诉我你是否还有问题。