gpt4 book ai didi

swift - 当循环中有条件地更改迭代器时,Swift C 样式循环的替代方案

转载 作者:行者123 更新时间:2023-11-28 09:56:27 26 4
gpt4 key购买 nike

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

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

最佳答案

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 风格的 for 循环的部分原因是许多带有计数器的循环实际上使用该计数器来索引集合,这是一种由集合迭代更好地服务的模式。所以你可能会做类似的事情:

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

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

如果您的循环实际上正在做这样的事情,那么以这种方式编写它会使您的代码的其他读者(包括您 future 的自己)更加清楚您的目的。

关于swift - 当循环中有条件地更改迭代器时,Swift C 样式循环的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36207356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com