(setValue :)无法在pictureURL中存储_SwiftValue类型的对象。只能存储NSNumber,NSString,NSDictionary和NSArray类型的对象

时间:2016-09-14 07:44:55

标签: ios swift firebase swift3 firebase-realtime-database

使用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

我曾经只是做

observation..... in {

let picture = snapshot.value!["pictureURL"]

但现在我想你必须明确告诉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)

我收到此错误:

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.

为什么会发生这种情况,我该如何解决?

编辑:

所以我发现只有在尝试从课堂上提取信息时才会发生这种情况。

    let data : Dictionary<String, Any> = ["Cats" : 3, "Dogs" : 9]

    DataService.ds.REF_BASE.child("testing").setValue(data)

以上代码有效。

   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)

该代码崩溃并说我无法分配swiftvalue类型。

3 个答案:

答案 0 :(得分:4)

看起来Firebase希望我们对Swift 3的数据类型非常具体。

我们需要直接告诉Swift我们将会拥有什么样的词典。在大多数情况下,它可能是

Dictionary<String, Any>

“任何”是Swift 3中的新东西我认为。 AnyObject在这里不起作用,因为Swift重新定义了AnyObjects,而Strings / Ints似乎不再是它们了。

最后,似乎我们的词典中绝对没有选项。也许一个可选的_SwiftValue?一旦我摆脱了选择权并且贪得无厌,每个价值都会在那里开始为我工作。

答案 1 :(得分:0)

class Dog {
       var fur : String?
    }

class Dog {
       var fur : String!
    }

没有选项

答案 2 :(得分:0)

you need to add absolutestring below is the example

if let profileUrl = url?.absoluteString 
{
        let values = ["name":name, "email":email, "password":password, "profileImageUrl":profileUrl] as [String : Any]
        self.registerUserWithImageIntoDatabase(uid: uid, values: values)
                            
}