For loop 专门用于在某个类的所有对象上循环的语法?

For loop 专门用于在某个类的所有对象上循环的语法?,for-loop,swift,For Loop,Swift,如果为-plus-,我可以将此组合的压缩为单个为 i、 e.能否将前两行合并为一条循环指令 它应该只访问childNodes中属于MyNode实例的对象 for childNode in childNodes { if let myNode = childNode as? MyNode { // do something with myNode } } 我假定childNodes是一个数组。如果是,则可以对其进行过滤: for childNode in (ch

如果为-plus-
,我可以将此组合的
压缩为单个

i、 e.能否将前两行合并为一条循环指令

它应该只访问
childNodes
中属于
MyNode
实例的对象

for childNode in childNodes {
    if let myNode = childNode as? MyNode {
         // do something with myNode
    }
}

我假定
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!)")
}
让findNext={(变量索引:Int)->(节点:MyNode?,下一个:Int)在
而索引
试试:

let nodes=childNodes.filter({$0为MyNode}).map({$0为MyNode})//数组
对于节点中的节点{
...
}
如果您不喜欢中间数组创建,下面是解决方案,但可能比上面的慢

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

这将构建一个全新的阵列,成本似乎有点太高。是的,这是正确的。我认为没有任何方法可以将
与可选绑定结合起来。如果您能确认
没有这样的
,并将其放在您的答案中,我将接受这个答案。谢谢您的提醒。但我仍然不愿意将那个数量的开销作为原始版本的替代方案。如果
-语法不再有压缩的
,我可能会坚持使用它。
//          ↓
let nodes = lazy(childNodes).filter({ $0 is MyNode }).map({ $0 as MyNode }) // nodes: LazySequence<MapSequenceView<FilterSequenceView<[Any]>, MyNode>>
for node in nodes {
   ...
}