Swift: создать плоский массив представлений из иерархии представлений

У меня есть иерархия представлений, и мне нужно преобразовать ее в линейный массив, скажем:

+ rootView 0 - subView 1 - subview 2 + subview 3 - subview 3.1 - subview 3.2 - subview 4

Мне нужен массив:

[0, 1, 2, 3, 3.1, 3.2, 4]

Мне интересно, можно ли использовать map или flatMap, или мне нужно использовать традиционный способ, например, ход в ширину?

Спасибо!


person hzxu    schedule 09.03.2018    source источник
comment
Сравните stackoverflow.com/questions/36605621/ .   -  person Martin R    schedule 10.03.2018


Ответы (1)


Я бы использовал рекурсивную функцию, которую вы можете вызвать для rootView.

func flattenSubviews(view: UIView) -> [UIView] {
    
    var flatArray: [UIView] = []
    flatArray.append(view)
    
    for subview in view.subviews {
        flatArray += flattenSubviews(view: subview)
    }
    return flatArray
}

.

let flattenedViews = flattenSubviews(view: rootView)

Немного более абстрактный способ написания вышеизложенного, поместив его в расширение:

extension UIView {

    func subviewsFlattened() -> [UIView] {
    
        var output: [UIView] = []
        output.append(self)
    
        for subview in self.subviews {
            output += subview.subviewsFlattened()
        }
    
        return output
    }

}

И затем вы можете вызвать его в любом представлении:

let allViews = someView.subviewsFlattened()
person Tysac    schedule 09.03.2018