For loop 专门用于在某个类的所有对象上循环的语法?
如果为-plus-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
,我可以将此组合的压缩为单个为
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 {
...
}