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
}
}
所以我正在将字典保存到我的 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
}
}