Firebase 在 Swift iOS 中检索我的 Double 作为字符串?

Firebase retrieves my Double as a String in Swift iOS?

所以我正在将字典保存到我的 firebase。该词典位于我创建的名为 FoodItem 的自定义 class 中。这是我保存字典的行:

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

foodItem 是一个 FoodItem 对象,这是我的 FoodItem class 实现 .toAnyObject()

的部分
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]
    }

所以这些代码组合起来将我的数据保存到我的 firebase 中。正常工作。但是当我检索数据时,我的价格变量是一个字符串?我会解释...

这是我检索数据的地方:

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()
    })
}

您在快照中看到的 FoodItem 构造函数从我的 firebase 中获取数据,并将我的 FoodItem 变量分配给我的 firebase 中的那些值。这是代码:

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
}

然而,当我 运行 我的代码时,我看到它将 double 打印为字符串

如您所见,Double 变量 "price" 周围有明显的引号。 我得到这个错误:

无法将“__NSCFString”类型的值 (0xff0ee0) 转换为 'NSNumber' (0x13ff81c)。

这行代码以红色突出显示:

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

它位于带有我上面发布的快照的 FoodItem 构造函数中。

有什么想法吗???

*编辑:它对我的 int 变量做同样的事情。同样的错误信息

它实际上从未将其保存为字符串。我相信我在那里有那个值作为一些旧代码,我在其中将它保存为一个字符串。我删除了数据库中的条目并再次尝试,它工作得很好。感谢那些试图回答我问题的人。

2017 年示例

它可能会节省一些人的打字时间,这里有一些完全典型的代码来观察一个简单的数值。假设它是一个叫做 SomeFraction.

的分数

一如既往,Firebase 表现出色 :)

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
    }
}