我可以将这个合并的for
- 加 - if
压缩为一个for
,
即。我可以将前两行合并为一个循环的指令吗?
它应该只访问childNodes
中MyNode
。
for childNode in childNodes {
if let myNode = childNode as? MyNode {
// do something with myNode
}
}
答案 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 {
...
}