use*_*041 5 ios firebase swift firebase-realtime-database swift3
使用Swift 3了解firebase有一些问题.
我重新让我的观察者看起来像这样:
currentUserFirebaseReference.observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in
let UID = snapshot.key
let dict = snapshot.value as! Dictionary<String,AnyObject>
let pictureURL = dict["pictureURL"] as! String
Run Code Online (Sandbox Code Playgroud)
我曾经只是这样做
observation..... in {
let picture = snapshot.value!["pictureURL"]
Run Code Online (Sandbox Code Playgroud)
但现在我想你必须明确告诉Firebase你正在处理一个字典吗?
当我试图设置一个值时,我的问题就来了.
我将上面的pictureURL添加到Person类中,后来我正在做:
let picURL = self.currentUserInfo.pictureURL // The picture from before
let info = ["pictureURL" : picURL, ....morestuff] as [String : Any] // Swift conversion added the String:Any bit. Assume this is correct?
ref.setValue(info)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Terminating app due to uncaught exception 'InvalidFirebaseData', reason: '(setValue:) Cannot store object of type _SwiftValue at pictureURL. Can only store objects of type NSNumber, NSString, NSDictionary, and NSArray.
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我该如何解决?
编辑:
所以我发现只有在尝试从类中提取信息时才会发生这种情况.
let data : Dictionary<String, Any> = ["Cats" : 3, "Dogs" : 9]
DataService.ds.REF_BASE.child("testing").setValue(data)
Run Code Online (Sandbox Code Playgroud)
上面的代码有效.
class Dog {
var fur : String?
}
let dog = Dog()
dog.fur = "Brown"
let data : Dictionary<String, Any> = ["Cats" : 3, "Dogs" : 9, "DogFur" : dog.fur]
DataService.ds.REF_BASE.child("testing").setValue(data)
Run Code Online (Sandbox Code Playgroud)
该代码崩溃并说我无法分配swiftvalue类型.
Firebase 似乎希望我们在 Swift 3 中对您的数据类型非常具体。
我们需要直接告诉 Swift 我们将拥有什么样的字典。在大多数情况下,它可能是
Dictionary<String, Any>
Run Code Online (Sandbox Code Playgroud)
我认为“任何”是 Swift 3 中的一个新事物。AnyObject 在这里不起作用,因为 Swift 重新定义了 AnyObjects 是什么,而 Strings/Ints 似乎不再是它们了。
最后,您的字典中似乎必须绝对没有选项。也许一个可选项是 _SwiftValue?一旦我摆脱了可选项并确定每个值都会在那里,它就开始为我工作。
| 归档时间: |
|
| 查看次数: |
3333 次 |
| 最近记录: |