我有一个循环,在Swift 2中通过除法递减整数。
for var i = 128; i >= 1 ; i = i/2 {
//do some thing
}
C风格的for循环已经被弃用,那么我该如何将其转换为Swift 3.0?
使用sequence
,可以实现非常规步长的通用循环:
for i in sequence(first: 128, next: { $0 >= 2 ? $0/2 : nil }) {
print(i)
}
i
是一个常量,其作用域仅限于循环体内。$0 >= 2
而不是i >= 1
),并且循环总是至少执行一次,针对第一个值。也可以编写一个包装器,类似于C风格的for循环,并且没有列出的缺点(受Erica Sadun: Stateful loops and sequences启发):
public func sequence<T>(first: T, while condition: @escaping (T)-> Bool, next: @escaping (T) -> T) -> UnfoldSequence<T, T> {
let nextState = { (state: inout T) -> T? in
guard condition(state) else { return nil }
defer { state = next(state) }
return state
}
return sequence(state: first, next: nextState)
}
然后将其用作
for i in sequence(first: 128, while: { $0 >= 1 }, next: { $0 / 2 }) {
print(i)
}
var i = 128
while i >= 1
{
// Do your stuff
i = i / 2
}
MartinR的解决方案非常通用和有用,应该成为您工具箱中的一部分。
另一个方法是重新表述您想要的内容:从7到0的二次幂。
for i in (0...7).reversed().map({ 1 << $0 }) {
print(i)
}
i /= 2
而不是i = i / 2
。 - rmaddy