在Swift中为JSON文件处理嵌套的for循环

时间:2015-09-03 18:53:38

标签: json swift

我做的一个JSON请求返回一个带有一堆嵌套信息的文件。格式大致如下组:>个人组 - >团队中的团队。

目前我正在使用嵌套的for循环来处理这个问题,在那里我查看外部组,然后运行内部循环以获取各个团队的信息。

我已将JSON文件的副本上传到粘贴bin,这是链接。 http://pastebin.com/D14wYDEs。这个特殊的例子没有那么多的团队和团队,但它可能有更多的方法,这使得嵌套for循环的概念看起来不切实际。

我想知道是否有人建议更好的制度,或任何建议。

继承我目前的代码:

func generateTablaDePosiciones() {
estadisticaUtilizada = 3
var tablaDePosicionesJSON = getJSONStats(3,tkn,eqID)

//checks to see that contents != nil, meaning the JSON file was found
if tablaDePosicionesJSON != nil {

    tablaDePosicionesArray.removeAll(keepCapacity: false)
    var numeroDeGruposEnTablaDePosiciones = tablaDePosicionesJSON["grupos"].count

    for var index = 0; index < numeroDeGruposEnTablaDePosiciones; ++index {

        var grupo = tablaDePosicionesJSON["grupos"][index]["grupo"].string
        var etiqueta1 = tablaDePosicionesJSON["grupos"][index]["etiqueta-1"].string
        var etiqueta2 = tablaDePosicionesJSON["grupos"][index]["etiqueta-2"].string
        var etiqueta3 = tablaDePosicionesJSON["grupos"][index]["etiqueta-3"].string
        var etiqueta4 = tablaDePosicionesJSON["grupos"][index]["etiqueta-4"].string
        var etiqueta5 = tablaDePosicionesJSON["grupos"][index]["etiqueta-5"].string
        var preTablaDePosicionesNuevo = preTablaDePosiciones(grupo: grupo!, etiqueta1: etiqueta1!, etiqueta2: etiqueta2!, etiqueta3: etiqueta3!, etiqueta4: etiqueta4!, etiqueta5: etiqueta5!)
        preTablaDePosicionesArray.append(preTablaDePosicionesNuevo)

        numeroDeTablaDePosiciones = tablaDePosicionesJSON["grupos"][index]["lista-body"].count

        for(var innerIndex = 0; innerIndex < numeroDeTablaDePosiciones; ++innerIndex) {

            var rank = tablaDePosicionesJSON["grupos"][index]["lista-body"][innerIndex]["rank"].string
            var equipoID = tablaDePosicionesJSON["grupos"][index]["lista-body"][innerIndex]["equipoID"].number! as Int
            var nomEquipo = tablaDePosicionesJSON["grupos"][index]["lista-body"][innerIndex]["nom-equipo"].string
            var d1 = tablaDePosicionesJSON["grupos"][index]["lista-body"][innerIndex]["d1"].string
            var d2 = tablaDePosicionesJSON["grupos"][index]["lista-body"][innerIndex]["d2"].string
            var d3 = tablaDePosicionesJSON["grupos"][index]["lista-body"][innerIndex]["d3"].string
            var d4 = tablaDePosicionesJSON["grupos"][index]["lista-body"][innerIndex]["d4"].string
            var d5 = tablaDePosicionesJSON["grupos"][index]["lista-body"][innerIndex]["d5"].string

            var tablaDePosicionesNuevo = tablaDePosiciones(rank: rank!, equipoID: equipoID, nomEquipo: nomEquipo!, d1: d1!, d2: d2!, d3: d3!, d4: d4!, d5: d5!)
                tablaDePosicionesArray.append(tablaDePosicionesNuevo)
        }
    }
} else {
    estadisticaUtilizada = 0
    println("Tabla de Posiciones JSON was nil")
}

}

1 个答案:

答案 0 :(得分:1)

我会使用while循环。每次执行时递增索引,然后使用该索引动态构造密钥。将结果收集到一个数组中,然后传递该数组而不是每个单独的对象。

此外,您应该解析所有这些值,因为您正在解析它们而不是强制解包(!)。在这个while循环中,您可以使用条件绑定while let来处理它,如果它失败 - 即。它没有找到该键的值 - 它将退出。

这样的事情:

var index = 1
var results = [String]()
while let etiqueta = grupo["etiqueta-\(index)"] as? String {
    results.append( etiqueta )
    index++
}
let preTablaDePosicionesNuevo = preTablaDePosiciones(grupo: name, etiquetas: results)
preTablaDePosicionesArray.append( preTablaDePosicionesNuevo )