У меня была такая же проблема, и я не мог понять, что ее вызывает. Недавно я преобразовал свои HTML-файлы с японского на UTF-8, но я ничего не делал с файлами сценариев. Как-то jquery-1.10.2.min.js был поврежден в этом процессе (я до сих пор не знаю, как). Замена jquery-1.10.2.min.js оригиналом исправил его.
Один подход к выравниванию рекурсивной структуры класса с рекурсивной функцией.
Вот класс, который мы хотели бы сгладить:
public class Nested {
public let n : Int
public let sub : [Nested]?
public init(_ n:Int, _ sub:[Nested]?) {
self.n = n
self.sub = sub
}
}
Вот функция, которая демонстрирует как это можно сделать:
func test() {
let h = [
Nested(1, [Nested(2, nil), Nested(3, nil)])
, Nested(4, nil)
, Nested(5, [Nested(6, nil), Nested(7, [Nested(8, nil), Nested(9, nil)])])
]
func recursiveFlat(next:Nested) -> [Nested] {
var res = [Nested]()
res.append(next)
if let subArray = next.sub {
res.appendContentsOf(subArray.flatMap({ (item) -> [Nested] in
recursiveFlat(item)
}))
}
return res
}
for item in h.flatMap(recursiveFlat) {
print(item.n)
}
}
Сердцем этого подхода является локальная функция recursiveFlat
. Он добавляет содержимое вложенного объекта к результату, а затем условно вызывает себя для каждого элемента, чтобы добавить его содержимое.
Во-первых, я настоятельно рекомендую сделать тип subObjects
не факультативным. В редких случаях для факультативных массивов нет причин. Действительно ли вам нужно различать «no array» и «empty array?»? Это очень редко. Если вы сделаете subObjects
просто массивом, вы можете написать то, что вы описываете как простую рекурсивную функцию:
func flattenMyObjects(myObjects: [MyObject]) -> [MyObject] {
return myObjects.flatMap { (myObject) -> [MyObject] in
var result = [myObject]
result.appendContentsOf(flattenMyObjects(myObject.subObjects))
return result
}
}
Если вам нужно, чтобы это было необязательным, изменения были незначительными (вы " вам нужно добавить if-let или что-то подобное).