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