循环遍历某个类的所有对象的语法特别?

时间:2014-11-19 09:59:33

标签: for-loop swift

我可以将这个合并的for - 加 - if压缩为一个for

即。我可以将前两行合并为一个循环的指令吗?

它应该只访问childNodesMyNode

实例中的那些对象
for childNode in childNodes {
    if let myNode = childNode as? MyNode {
         // do something with myNode
    }
}

2 个答案:

答案 0 :(得分:1)

我认为childNodes是一个数组。如果是,那么你可以过滤它:

for childNode in (childNodes.filter { $0 is MyNode }) {
    println ("It's a node")
}

或者如果您更喜欢更明确的代码:

let nodes = childNodes.filter { $0 is MyNode }
for childNode in nodes {
    println ("It's a node")
}

据我所知,在swift中没有简洁的方法将for循环与可选绑定结合起来以跳过一些迭代。

使用标准for循环可能有些东西,结合一个闭包,给定一个索引,返回包含MyNode实例的下一个索引...但我不会称之为简化代码和可读性:

let findNext = { (var index: Int) -> (node: MyNode?, next: Int) in
    while index < childNodes.count {
        if let node = childNodes[index] as? MyNode {
            return (node, index)
        }
        ++index
    }

    return (nil, index)
}

for var (node, index) = findNext(0); node != nil; (node, index) = findNext(index + 1) {
    println ("it's a node: \(node!)")
}

答案 1 :(得分:0)

尝试:

let nodes = childNodes.filter({ $0 is MyNode }).map({ $0 as MyNode }) // Array<MyNode>
for node in nodes {
   ...
}

如果您不喜欢创建中间数组,那么下面的解决方案就是解决方案,但可能比上面的更慢。

//          ↓
let nodes = lazy(childNodes).filter({ $0 is MyNode }).map({ $0 as MyNode }) // nodes: LazySequence<MapSequenceView<FilterSequenceView<[Any]>, MyNode>>
for node in nodes {
   ...
}