我有这个循环,在 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)
}
关于swift - 将对步骤使用除法的 C 样式 for 循环转换为 Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39903503/