首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >特殊的语法,用于循环某个类的所有对象?

特殊的语法,用于循环某个类的所有对象?
EN

Stack Overflow用户
提问于 2014-11-19 09:59:32
回答 2查看 45关注 0票数 1

我能把这个组合的for-plus-if压缩成一个for吗,

也就是说,我能把前两行合并成一个循环指令吗?

它应该只访问childNodes中作为MyNode实例的对象。

代码语言:javascript
运行
复制
for childNode in childNodes {
    if let myNode = childNode as? MyNode {
         // do something with myNode
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-19 10:04:03

我假定childNodes是一个数组。如果是,那么您可以过滤它:

代码语言:javascript
运行
复制
for childNode in (childNodes.filter { $0 is MyNode }) {
    println ("It's a node")
}

或者如果您更喜欢更显式的代码:

代码语言:javascript
运行
复制
let nodes = childNodes.filter { $0 is MyNode }
for childNode in nodes {
    println ("It's a node")
}

据我所知,在斯威夫特中,没有干净的方法可以将for循环与可选绑定结合起来,以跳过一些迭代。

可以使用标准的for循环,结合给定索引的闭包返回包含MyNode实例的下一个索引.但我不认为它在代码和可读性方面是简化的:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2014-11-19 10:47:25

尝试:

代码语言:javascript
运行
复制
let nodes = childNodes.filter({ $0 is MyNode }).map({ $0 as MyNode }) // Array<MyNode>
for node in nodes {
   ...
}

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

代码语言:javascript
运行
复制
//          ↓
let nodes = lazy(childNodes).filter({ $0 is MyNode }).map({ $0 as MyNode }) // nodes: LazySequence<MapSequenceView<FilterSequenceView<[Any]>, MyNode>>
for node in nodes {
   ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27013871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档