为什么要替换元素而不是追加?

时间:2016-05-24 03:00:59

标签: ios arrays swift

我正在阅读一个非常大的json文件并提取数据。我现在可以提取正确的数据,但是当我尝试将其附加到数组时,它最终会替换它。

func parseJSON(json: JSON){

    let predicate = {
        (json: JSON) -> Bool in
        if let jsonID = json["class"].string where jsonID == "sg-header-heading"{

            return true

        }
        return false
    }
    var backclass = ViewController()
    let foundJSON = json.findmultiple(backclass, predicate: predicate)

使用此扩展程序搜索与“sg-header-heading”匹配的多个值 当我在扩展中打印数组时,这就是我得到的。但是当我在上面打印时,我得到零。另外,我最终只得到一个值而不是6个值。

enter image description here

extension JSON{

func findmultiple(viewclass: ViewController, @noescape predicate: JSON -> Bool) -> JSON? {

   var backclass = ViewController()

    if predicate(self) {
        return self
    }
    else {
        if let subJSON = (dictionary?.map { $0.1 } ?? array) {
            for json in subJSON {

                if let foundJSON = json.findmultiple(backclass, predicate: predicate) {
                    let shorten = foundJSON["html"].stringValue
                    let firstshort = shorten.componentsSeparatedByString("   ")
                    let secondshort = firstshort[1].componentsSeparatedByString("\r")
                    let classname = secondshort[0]
                    if(classname == "STUDY HALL (INSTRUCT)"){
                        print("skip")
                    }else{
                        backclass.importClass.append(classname)
                        print("fsgsfg \(backclass.importClass)")
                        //backclass.collection.reloadData()
                    }


                }
            }
        }
    }

    return nil
}
}

1 个答案:

答案 0 :(得分:3)

您首先从最外层的上下文(let foundJSON = json.findmultiple(predicate))调用findmultiple()。在执行代码并且var backclass = ViewController()实际执行时,它会创建一个带有findmultiple()的新实例。当代码进入其循环时,它会以递归方式再次执行backclass。当代码进入其循环时,它会创建一个ViewController的新实例。每次进行循环时,递归都会更深入,每次都会创建backclass的新实例,因此ViewController始终指向backclass的新实例。

解决方法是在更高级别创建var backclass = ViewController() let foundJSON = json.findmultiple(backclass, predicate) 。您可以尝试这样的方法:

backclass

请注意,这意味着从递归调用发生的循环内部将findmultiple传递给var points = new Array(100); for (var i = 0; i < 100; i++) { points[i] = i + 1; } for(var i = 0; i < points.length; i++) { console.log(points[i]); }