Ios 从Firebase检索字典数组&;斯威夫特3
我在firebase上有一个json数据库,试图获取它们并将其放入本地字典数组中 我在Firebase上的json模型 我的结构模型如下所示Ios 从Firebase检索字典数组&;斯威夫特3,ios,swift,firebase,swift3,firebase-realtime-database,Ios,Swift,Firebase,Swift3,Firebase Realtime Database,我在firebase上有一个json数据库,试图获取它们并将其放入本地字典数组中 我在Firebase上的json模型 我的结构模型如下所示 struct Places { var type:String! var country:String! var name:String! var image:String! var coords:[Coords]! init(type: String, country: String, name: String, image: String, co
struct Places {
var type:String!
var country:String!
var name:String!
var image:String!
var coords:[Coords]!
init(type: String, country: String, name: String, image: String, coords: [Coords]) {
self.type = type
self.country = country
self.name = name
self.image = image
self.coords = coords
}
init(snapshot: FIRDataSnapshot) {
let snapshotValue = snapshot.value as! [String:Any]
type = snapshotValue["type"] as! String
country = snapshotValue["country"] as! String
name = snapshotValue["name"] as! String
image = snapshotValue["image"] as! String
coords = snapshotValue["coords"] as! [Coords]!
}
}
还有如下[Coords]结构模型:
struct Coords {
var latStart:String!
var latEnd:String!
var lonStart:String!
var lonEnd:String!
init(latStart: String, latEnd: String, lonStart: String, lonEnd: String) {
self.latStart = latStart
self.latEnd = latEnd
self.lonStart = lonStart
self.lonEnd = lonEnd
}
}
我试图通过以下代码获取并放置json数据:
placesRef.observeSingleEvent(of: .value, with: { (snapshot) in
if !snapshot.exists() {
print("data not exist")
return
}
var plc: [Places] = []
for eachPlace in (snapshot.children){
let place = Places(snapshot: eachPlace as! FIRDataSnapshot)
plc.append(place)
}
self.allPlaces = plc
问题是我可以在字典数组中得到字典数组,除了coords字典。[Coords]字典似乎为空,我想知道问题出在哪里。谢谢你的建议。因为
snapshotValue[“coords”]as![Coords]代码>还不是合作伙伴。它们只是字典。您必须遍历snapshotValue[“coords”]
和init acoords
对象中的每个字典,然后在完成后将它们全部分组到一个数组中,并将其分配给Places
结构的self.coords
。map
功能对此非常方便
示例:
我会将Coords
init函数更改为如下内容:
init(dictionary: [String : AnyObject]) {
self.latStart = dictionary["lat1"] as? String
//...
//...
}
coords = (snapshotValue["coords"] as? [[String : AnyObject]])?.map({ Coord(dictionary: $0) })
然后在Places
init中使用如下内容:
init(dictionary: [String : AnyObject]) {
self.latStart = dictionary["lat1"] as? String
//...
//...
}
coords = (snapshotValue["coords"] as? [[String : AnyObject]])?.map({ Coord(dictionary: $0) })
我没有对此进行测试,也没有在这里做一些假设,但你应该可以做一些类似的工作。你能添加一个在这种情况下使用map
函数的示例吗?@ForestKunecke我添加了一个未经测试的示例。它不再给出错误,但在打印allPlaces数组时仍然为零;地点(类型:城市,国家:美国,名称:纽约市,图像:纽约市,坐标:nil)]如果snapshotValue[“坐标”]
不是我示例中的类型[[String:AnyObject]]
,则很可能为零。我没有测试这个,所以你必须确保你自己有正确的类型。这应该是可以接受的解决方案。我也有同样的问题,它帮助了我。