2016-04-22 11 views
1

Also speichere ich ein Wörterbuch in meine Firebase. Das Wörterbuch befindet sich in einer benutzerdefinierten Klasse namens FoodItem. Hier ist die Linien, wo ich das Wörterbuch sparen:Firebase ruft mein Double als String in Swift iOS ab?

let favRef = self.ref.childByAppendingPath("urlhidden") 
favRef.setValue(foodItem.toAnyObject()) 

foodItem ist ein FoodItem Objekt, hier ist der Teil meiner FoodItem Klasse, die .toAnyObject implementiert()

var key: String 
var ref: Firebase? 
var name: String 
var description: String 
var minCal: Int 
var maxCal: Int 
var containsNuts: Bool 
var vegetarian: Bool 
var price: Double //**NOTE THAT PRICE IS A DOUBLE** 

func toAnyObject()->[String:AnyObject]{ 
    return ["name":self.name, 
      "price":self.price, 
      "description":self.description, 
      "minCal":self.minCal, 
      "maxCal":self.maxCal, 
      "containsNuts":self.containsNuts, 
      "vegetarian":self.vegetarian] 
    } 

also jene Bits des Codes kombiniert speichert meine Daten zu meinem Firebase. Funktioniert wie es sollte. Aber wenn ich die Daten abrufe, ist meine Preisvariable eine Zeichenkette? Ich werde erklären ...

Hier ist, wo ich die Daten abrufen:

func getCurrentOrder(){ 
    let uid = ref.authData.uid 
    ref = Firebase(url: "urlhidden") 
    ref.observeEventType(.Value, withBlock: { snapshot in 

     var newItems = [FoodItem]() 

     for item in snapshot.children { 

      let foodItem = FoodItem(snapshot: item as! FDataSnapshot) 
      newItems.append(foodItem) 
     } 

     self.order = newItems 
     self.tableView.reloadData() 
    }) 
} 

Des FoodItem Konstruktor Sie mit dem Schnappschuss zu sehen nimmt die Daten von meiner Feuerbasis und ordnet meine FoodItem Variablen auf diese Werte in meiner Feuerbasis . Hier ist der Code:

init(snapshot: FDataSnapshot) { 
    key = snapshot.key 
    name = snapshot.value["name"] as! String 
    price = snapshot.value["price"] as! Double //**NOTE STILL A DOUBLE** 
    description = snapshot.value["description"] as! String 
    minCal = snapshot.value["minCal"] as! Int 
    maxCal = snapshot.value["maxCal"] as! Int 
    containsNuts = snapshot.value["containsNuts"] as! Bool 
    vegetarian = snapshot.value["vegetarian"] as! Bool 

    ref = snapshot.ref 
} 

Allerdings, wenn ich meinen Code ausführen, sehe ich, dass es druckt das Doppel als String There are quotes around the value of my price

Wie Sie sehen können, gibt es eindeutig Anführungszeichen um den Double-Variable „Preis“ . Und ich bekomme diesen Fehler:

Konnte den Wert des Typs '__NSCFString' (0xff0ee0) nicht in 'NSNumber' (0x13ff81c) umwandeln.

Mit dieser Codezeile rot markiert:

price = snapshot.value["price"] as! Double 

, die innerhalb des FoodItem Konstruktor mit dem Snapshot angeordnet ist, wie ich oben geschrieben.

Irgendwelche Ideen ???

* EDIT: Es macht das gleiche für meine int Variablen. Die gleiche Fehlermeldung

+0

Dies kann kein Problem (derzeit), aber Firebase nicht direkt Doubles unterstützen. Es unterstützt 4 Objekttypen; NSString, NSNumber, NSDictionary, NSArray. Möglicherweise möchten Sie Ihr Double in eine NSNumber für die Speicherung in Firebase verpacken. Wie es ist, speichern Sie es als eine Zeichenfolge. Es könnte ein Problem sein, wenn ein ungültiges Zeichen gespeichert wird oder vielleicht eine leere Zeichenfolge anstelle von 0. – Jay

Antwort

4

Es tatsächlich nie gespeichert es als String. Ich glaube, ich hatte diesen Wert als einen alten Code, in dem ich ihn als String gespeichert habe. Ich löschte meine Einträge in der Datenbank und versuchte es erneut und es funktioniert gut. Danke an alle, die versucht haben, meine Frage zu beantworten.

1

2017 Beispiel

Es einige Typisierung jemand retten kann, dann ist hier einige ganz typische Code eine einfache Zahlenwert zu beobachten. Nehmen wir an, es ist ein Bruchteil namens Some Fraction.

Wie immer Firebase Felsen :)

override func viewDidAppear(_ animated: Bool) { 

    super.viewDidAppear(animated) 
    dev_listenForLiveFraction() 
} 

var r1: DatabaseReference? = nil 
func dev_listenForLiveFraction() { 

    let p1 = "something/someFractionForExample" 

    r1 = Database.database().reference(withPath: p1) 
    r1!.observe(.value) { (snapshot) in 

     let sf: NSNumber = snapshot.value as? NSNumber ?? 0.666 
     self.example_handleSomeFraction(sf) 
    } 
} 

func example_handleSomeFraction(_ sf: NSNumber) { 

    print("the fraction is now \(sf)") 
} 

override func viewDidDisappear(_ animated: Bool) { 

    super.viewDidDisappear(animated) 
    clearObservations() 
} 

private func clearObservations() { 

    if r1 != nil { 

     r1?.removeAllObservers() 
     r1 = nil 
    } 
}