swift中的快速循环和动态范围
…或者如何在for循环条件内使用索引 大家好 由于swift 3中没有c风格的循环,我似乎找不到一种方法来表达更复杂的循环,所以也许你可以帮我 如果我写这个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(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 */