swift中的快速循环和动态范围

swift中的快速循环和动态范围,swift,for-loop,iteration,swift3,Swift,For Loop,Iteration,Swift3,…或者如何在for循环条件内使用索引 大家好 由于swift 3中没有c风格的循环,我似乎找不到一种方法来表达更复杂的循环,所以也许你可以帮我 如果我写这个 for(int i=5; num/i > 0; i*=5) 在swift 3中,我将如何做到这一点 我遇到的问题是: for i in stride(from: 5, through: num, by: 5) where num/i > 0 但是如果我是:5,25,125等等,这当然会一次迭代5个块 有什么想法吗 感谢使用

…或者如何在for循环条件内使用索引

大家好 由于swift 3中没有c风格的循环,我似乎找不到一种方法来表达更复杂的循环,所以也许你可以帮我

如果我写这个

for(int i=5; num/i > 0; i*=5)
在swift 3中,我将如何做到这一点

我遇到的问题是:

for i in stride(from: 5, through: num, by: 5) where num/i > 0 
但是如果我是:5,25,125等等,这当然会一次迭代5个块

有什么想法吗

感谢使用helper函数(最初定义于)

更简单的解决方案是while循环:

var i = 5
while num/i > 0 {
    print(i)
    i *= 5
}
但第一种解决方案的优点是,循环变量的范围仅限于循环体,并且循环变量是常量

Swift 3.1将提供, 然后不再需要辅助函数:

let num = 1000
for i in sequence(first: 5, next: { $0 * 5 }).prefix(while: { num/$0 > 0 }) {
    print(i)
}

上述所有解都与给定的C循环“等价”。 但是,如果
num
接近
Int.max
$0*5
溢出。如果这是一个问题,那么你必须检查 如果执行乘法之前,
$0*5
符合整数范围

事实上,这使得循环更简单——至少如果我们假设是这样的话
num>=5
以便循环至少执行一次:

for i in sequence(first: 5, next: { $0 <= num/5  ? $0 * 5 : nil }) {
    print(i)
}

用于顺序中的i(第一个:5,下一个:{$0用于完整性:
的替代方法,而
循环方法使用:

让num=1000
变量i=5
对于任何迭代器中的i({

如果我们在讨论整数,则不是<代码> num /i> 0 < <代码>同写“代码> < <代码> > @ SulaNo,请考虑<代码> num=5 < /c> >代码> i=5 < /代码>,以及<代码> num=5 < /代码>代码> i=-5 < /COD> >此外,您还必须在for循环条件中使用i,请注意,这一次更新循环变量太频繁了。(即,即使在返回
nil
)时,这可能会导致此应用程序中出现整数溢出,并且在其他用例中可能会出现问题(例如遍历链表)@MartinR啊是的,我注意到我的答案中有额外的增加,但我没有意识到它可能带来的危险。更新了一个版本,至少类似于
while
循环,w.r.t。循环完成后外部
I
的值。谢谢!作为一个可怕的替代方案(可怕的是,即使不考虑缺少
Double
Int
边界检查)到上面的帮助函数,直到Swift 3.1,人们也可以使用
序列(第一个:5,下一个:{$0*5})。前缀(Int(log(Double(num))/log(5))
;@dfri:…和可能的舍入错误。-我真的认为即将到来的
前缀(while:)
drop(while:)
将很好地解决这一问题和类似的问题。事实上,撇开玩笑不谈,
序列(first:5,next:{num/$0>0?$0*5:nil})。dropLast()应该是一个有效的替代方法,使用
可选的
-返回
序列中的
下一个
闭包(first:T,next:T->T?)
@dfri:实际上,在这种特殊情况下,i的顺序应该是
(第一个:5,下一个:{$0。这种变化的问题是(正如我注意到的,你已经在你的链接答案中写了一个缺点),我们总是访问至少一个元素,即使它打破了不变量(如果
num>=5,这当然不是问题。)但是
dropLast()确实存在整数溢出问题吗
变化,这在其他情况下不存在?为任何给定的
num
计算的最后一个整数将是
i
最后使用值大小的
5倍。但该值也存在,例如,在上述帮助器中的
状态下,对于最后一个
nil
返回过程。
let num = 1000
for i in sequence(first: 5, next: { $0 * 5 }).prefix(while: { num/$0 > 0 }) {
    print(i)
}
for i in sequence(first: 5, next: { $0 <= num/5  ? $0 * 5 : nil }) {
    print(i)
}
let num = 1000

var i = 5
for i in AnyIterator<Int>({
    return i <= num ? { defer { i *= 5 }; return i }() : nil
}) {
    // note that we choose to shadow the external i variable name,
    // such that any access to i within this loop will only refer
    // to the loop local immutable variable i.
    print(i)

    // e.g. i += 1 not legal, i refers to a constant here!

} /* 5 
     25 
     125 
     625 */