iOS Firebase从子节点检索数据始终为零

时间:2019-03-12 09:10:59

标签: ios swift firebase firebase-realtime-database

我正在尝试读取纬度和经度数据,该数据存储在随机子ID下。我的数据结构如下:

enter image description here

这是我的检索代码。

ref.child("locations").observe(.value, with: { snapshot in
for child in snapshot.children  {
                let valueD = child as! DataSnapshot
                let randomkey = valueD.key
                print(randomkey)
                print(valueD.value)
                let lat = (valueD.value as? NSDictionary)?["Latitude"] as? String
                print(lat) 
}})

对于valueD.value,控制台将打印此内容(正确)

Optional({
Latitude = "1.342433333333333";
Longitude = "103.9639883333333";
Type = 0;
})

但是,对于lat,它返回nil

为什么lat没有价值?我该如何解决?谢谢!

3 个答案:

答案 0 :(得分:1)

感谢大家的回应!确实是与展开Optional有关的问题。

我尝试了以前的解决方案。该解决方案对我来说效果最好,因为我从数据库中知道我肯定会拥有纬度和经度数据:交换为感叹号。

let latitude = (valueD.value as! NSDictionary)["Latitude"] as! Double

答案 1 :(得分:0)

您是否尝试过if let lat = child.value["Latitude"] as? Double?例如:

ref.child("locations").observe(.value, with: { snapshot in
for child in snapshot.children  {

                let valueD = child as! DataSnapshot
                let randomkey = valueD.key
                print(randomkey)
                print(valueD.value)

                if let lat = child.value["Latitude"] as? Double {
                    print(lat)
                }
}})

答案 2 :(得分:0)

您必须安全地打开可选组件。有很多方法可以做到这一点。我最喜欢的方法之一是使用guard let语句

// This output already says 'Optional'
Optional({
Latitude = "1.342433333333333";
Longitude = "103.9639883333333";
Type = 0;
})

像这样打开它:

ref.child("locations").observe(.value, with: { snapshot in
for child in snapshot.children  {

                let valueD = child as! DataSnapshot
                let randomkey = valueD.key
                print(randomkey)
                print(valueD.value)

                // Unwrap
                guard let childValue = valueD.value else { return }
                print(childValue["Latitude"])
}})