Перебор неопределенной длины вложенных массивов

#arrays #swift

#массивы #swift

Вопрос:

как выполнить итерацию по этой переменной, где у sub может быть еще 10 подмассивов, например.?

 struct Struct {
    let title: String
    let sub: [Struct]?
}

let variable = Struct(
    title: "1",
    sub: [
        Struct(title: "1.1", sub: nil),
        Struct(title: "1.2", sub: [
            Struct(title: "1.2.1", sub: nil),
            Struct(title: "1.2.2", sub: [
                Struct(title: "1.2.2.1", sub: nil)
            ])
        ])
    ]
)
 

Комментарии:

1. Главное, что мои display вызовы children.map { $0.display } . Если каждый узел печатает и сообщает своим дочерним элементам печатать, вы напечатали их все.

Ответ №1:

Это довольно просто. Рекурсия. Допустим, мы просто хотим напечатать все заголовки. Представьте себе метод, в котором узел печатает свой заголовок, а затем вызывает один и тот же метод для каждого из своих дочерних элементов. По определению, если вы вызываете этот метод на корневом узле, теперь вы напечатали все заголовки. Минимальная реализация (не беспокоясь о порядке посещения или формате вывода) будет:

 func output() {
    print(title)
    self.sub?.forEach { $0.output() }
}