我正在阅读一个非常大的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个值。
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
}
}
答案 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]);
}
。