从Firebase&中检索字典数组斯威夫特3

时间:2017-03-28 19:11:12

标签: ios swift firebase swift3 firebase-realtime-database

我在firebase上有一个json数据库,并尝试将它们放入本地字典数组中。

我在Firebase上的json模型

enter image description here

我的结构模型也如下所示

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]字典似乎无效,我想知道问题是什么。谢谢你的任何建议。

1 个答案:

答案 0 :(得分:0)

因为snapshotValue["coords"] as! [Coords]!还不是Coords。它们只是字典。您必须遍历snapshotValue[“coords”]中的每个字典并初始化Coords对象,然后当您完成将它们全部分组到一个数组中并将其分配给self.coords Places时结构。 map函数非常方便。

示例:

我会将Coords init函数更改为:

init(dictionary: [String : AnyObject]) {
    self.latStart = dictionary["lat1"] as? String
    //...
    //...
}

然后在Places init中使用类似:

的内容
coords = (snapshotValue["coords"] as? [[String : AnyObject]])?.map({ Coord(dictionary: $0) })

我没有对此进行测试并在此做出一些假设,但你应该能够做出类似的工作。