Ios 使用函数递归循环遍历数组数组

Ios 使用函数递归循环遍历数组数组,ios,swift,Ios,Swift,我想循环查看我的视图子视图,对于每个子视图,循环查看其子视图等 假设我有以下代码: let view = myVC.view view.backgroundColor = UIColor.clearColor() 然后对每个子视图重复相同的操作。我想从功能上做这件事 任何洞察都是值得赞赏的 编辑: 说清楚 我在找这样的东西: view.subviews.chanageColor() { (aView, aColor) in aView.backgroundColor = aColor } m

我想循环查看我的视图子视图,对于每个子视图,循环查看其子视图等

假设我有以下代码:

let view = myVC.view
view.backgroundColor = UIColor.clearColor()
然后对每个子视图重复相同的操作。我想从功能上做这件事

任何洞察都是值得赞赏的

编辑:

说清楚

我在找这样的东西:

view.subviews.chanageColor() { (aView, aColor) in
aView.backgroundColor = aColor
}
myVC.view.subviews.changeColor(color)
但它应该是递归的,它会转到每个视图子视图。

类似这样的内容

func makeAllSubviewsClear(view: UIView!)
{
    view.backgroundColor = UIColor.clearColor()
    for eachSubview in view.subviews
    {
        makeAllSubviewsClear(eachSubview)
    }
}
致电:

let view = myVC.view
makeAllSubviewsClear(view)
下面呢

let _ = myVC.view.subviews.map{ $0.backgroundColor = UIColor.clearColor() }
尽管map在imho中的使用应该有所不同

编辑: 我刚刚看到OP想要递归循环,这是另一回事。您应该将此代码移动到函数中,并为每个$0递归调用它

也许是这样的:

extension Array where Element: UIView {
    func changeColor(color: UIColor) {
        for view in self {
            view.subviews.changeColor(color)
            view.backgroundColor = color
        }
    }
}
看起来很实用,可以这样调用:

view.subviews.chanageColor() { (aView, aColor) in
aView.backgroundColor = aColor
}
myVC.view.subviews.changeColor(color)
受@fogmaister启发,还有一个解决方案:

extension Array where Element: UIView {
    func applyChange(closure: (UIView)->()) {
        for view in self {
            view.subviews.applyChange(closure)
            closure(view)
        }
    }
}
使用队列而不是递归。 我想你可以这样做

extension UIView {    
    func changeColor(color: UIColor) {
        var queue = [self]

        while let view = queue.first() {
            queue += view.subviews

            view.backgroundColor = color

            queue.remove(view)
        }
    }
}
我会用一个队列来做,而不是递归地做。但这种方法不起作用

做你想问的事 你可以这样做,这就是你在问题中提出的你想做的

extension UIView {
    // this name isn't very good but you get the idea
    func applyChangeToAllSubviews(block: (UIView) -> ()) {
        var queue = [self]

        // I don't have my dev computer dos not sure of the syntax
        while let view = queue.first() {
            queue += view.subviews

            block(view)

            queue.remove(view)
        }
    }
}
然后像…一样运行它

someView.applyChangeToAllSubviews {
    view in
    view.backgroundColor = UIColor.whiteColor()
}

我想这更实用一些。。。ish.

这里有一个可能的通用解决方案,它允许 遍历任何“嵌套序列”。它不限于
UIView
子视图
,但使用一个参数将每个序列元素映射到其直接子元素

它还将遍历序列的任务与 通过返回
生成器对元素执行操作(如设置背景色),该生成器
可以与现有方法一起使用,如
forEach()

(这是受以下问题的一些答案启发的。)

返回所有(嵌套)子视图的(惰性)生成器。通过在此生成器上调用
forEach()
,我们可以修改每个子视图:

view.subviews.generate(children: { $0.subviews }).forEach {
    $0.backgroundColor = UIColor.clearColor()
}
但它也可用于获取包含所有嵌套子视图的数组:

let allViews = Array(view.subviews.generate(children: { $0.subviews }))

谢谢你的回答,但这是递归的。它不起作用关于递归方法的一行调用,什么是不起作用的?也许这个问题有点让人困惑,但这样做是没有意义的。将冷却器传递到递归函数会更有意义。从“功能上”这样做有什么好处?@Fogmeister可能什么都没有。我只想“功能性地”做,因为我可以递归地做,而且我在功能性swift方面很弱。好吧,看看我的答案。它可以做你想做的事?我用你的解决方案作为递归函数swift答案的灵感:)虽然它更像是一个编辑,但我使用了数组扩展。酷,我也在考虑这样做D