当迭代器在循环内有条件地更改时,替代Swift C风格的循环

时间:2016-03-24 18:21:30

标签: swift swift2

使用Swift 2.2弃用C风格的循环,我现在需要找到for循环的替代方法,其中迭代器在循环内有条件地更改。什么是Swifty的做法:

    for var i = 1; i <= 10; i++ {
        //do stuff
        if checkCondition() {
            i--
        }
    }

3 个答案:

答案 0 :(得分:3)

通过动态更新循环块中的迭代,您可能最好使用类似的while循环

var i = 1
while(i <= 10) {
    if checkCondition() {
        i -= 1
    }
    print(i)
    i += 1
}

答案 1 :(得分:3)

for循环中声明的迭代器变量的范围是通过该循环的单个传递,因此如果要在循环中多次传递时更改它,则需要使用while而是循环。

此外,由于您的意图似乎是“仅在checkCondition()为假”时“仅增加循环计数器”,您可以使用单个条件增量更清楚地执行此操作,而不是使用递减以撤消增量。以下是几个例子:

var i = 1
while i <= 10 {
    if !checkCondition() {
        i += 1
    }
}

var j = 1
while j <= 10 {
    j = checkCondition() ? j : j + 1
}

还有一个可能有点傻,但如果你做了很多这样的话可能会派上用场:

extension IntegerType {
    mutating func incrementIf(@autoclosure condition: () -> Bool) {
        if condition() {
            self = self + 1
        }
    }
}
var k = 1
while k <= 10 {
    k.incrementIf(!checkCondition())
}

当然,还有一个问题是你是否想要遵循这种基于反制的模式(如评论中的@Sulthan注释)。为什么Swift取消C-style for循环的部分原因是许多带有计数器的循环实际上使用该计数器来索引集合,这是一种更好地通过集合迭代服务的模式。所以你可能会做类似的事情:

for item in collection {
    process(item)
    if item.needsMoreProcessing {
        process(item) // some more
    }
}

for item in collection {
    while item.needsProcessing {
        process(item)
    }
}

如果你的循环实际上是这样的,那么以这种方式编写它会让你的代码的其他读者(包括你未来的自我)更清楚你的目的。

答案 2 :(得分:-1)

C&#39; For循环将简单地替换为Swift的For-In循环。这意味着:

for var i = 1; i <= 10; i++ {
    //do stuff
    if checkCondition() {
        i--
    }
}

成为这个:

for i in 1...10 {
    //do stuff
    if checkCondition() {
        i-=i
    }
}

1...10是我们想要迭代的范围:从110