【问题标题】:Firebase retrieves my Double as a String in Swift iOS?Firebase 在 Swift iOS 中检索我的 Double 作为字符串?
【发布时间】:2017-11-24 20:57:38
【问题描述】:

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

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

foodItem 是一个 FoodItem 对象,这是我的 FoodItem 类中实现 .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 变量“price”周围有明显的引号。 我得到这个错误:

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

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

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

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

有什么想法???

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

【问题讨论】:

  • 这可能不是问题(目前),但 Firebase 不直接支持 Doubles。它支持4种对象类型; NSString、NSNumber、NSDictionary、NSArray。您可能需要考虑将您的 double 包装到 NSNumber 中,以便存储到 Firebase 中。实际上,您将其存储为字符串。如果存储了无效的字符或者可能是空字符串而不是 0,这可能是一个问题。

标签: ios string swift firebase double


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2017-06-27
      • 2021-06-25
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多