2016-09-14 12 views
5

uwzględniając pewne problemy ze zrozumieniem Firebase z Swift 3.(setValue :) Nie można zapisać obiektu typu _SwiftValue w pictureURL. Można przechowywać tylko obiekty typu NSNumber, NSString, NSDictionary i NSArray

mam przerobiony moje obserwatora wyglądać tak:

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 

kiedyś po prostu zrobić:

observation..... in { 

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

Ale teraz domyślam się, że musisz wyraźnie powiedzieć Firebase, że masz do czynienia ze Słownikiem?

Mój problem pojawia się, gdy próbuję ustawić wartość.

Dodaję ten pictureURL od góry do klasy Person, a potem robię:

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) 

i otrzymuję ten błąd:

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. 

Dlaczego tak się dzieje i jak czy mogę to naprawić?

edit:

Tak więc okazało się, dzieje się tak dopiero, gdy próbuje wyciągnąć informacje od klasy.

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

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

Powyższy kod działa.

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) 

Ten kod ulega awarii i mówi, że nie mogę przypisać typu wartości swift.

+0

Co jest 'ref'? –

+0

Moje odwołanie do bazy firebase, w której chcę przechowywać informacje. Pełna treść to "DataService.ds.refPost.child (searchBar.text! .lowercased()). Child (" users ") child (self.currentUser!). SetValue (info). problemu, którego nie mogę sobie wyobrazić, ponieważ ten kod działał, zanim zostałem przeniesiony do Swift 3. – user6820041

+0

Spróbuj zmienić '[String: Any]' na 'NSDictionary'. –

Odpowiedz

3

Wygląda Firebase chcąc nam być bardzo specyficzne ze swoimi typami danych z Swift 3.

Musimy prosto powiedzieć Swift jaką słowniku Jedziemy mieć. W większości przypadków będzie to prawdopodobnie

Dictionary<String, Any> 

"Any" to nowa rzecz w Swift 3 Myślę. AnyObject nie działa tutaj, ponieważ Swift przedefiniował to, co AnyObjects są, a Strings/Ints nie wydają się już nimi być.

Wreszcie, wydaje się, że nie mamy absolutnie żadnych opcji w twoim słowniku. Może opcjonalne jest _SwiftValue? Kiedy pozbyłem się opcji i fanatyków, każda wartość będzie tam, zaczęło działać dla mnie.

0
class Dog { 
     var fur : String? 
    } 

do

class Dog { 
     var fur : String! 
    } 

bez optionals