Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从Firebase检索字典数组&;斯威夫特3_Ios_Swift_Firebase_Swift3_Firebase Realtime Database - Fatal编程技术网

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

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

我在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, 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 a
coords
对象中的每个字典,然后在完成后将它们全部分组到一个数组中,并将其分配给
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]]
,则很可能为零。我没有测试这个,所以你必须确保你自己有正确的类型。这应该是可以接受的解决方案。我也有同样的问题,它帮助了我。