将使用除法步骤的C风格for循环转换为Swift 3

Jus*_*ath 3 for-loop swift swift3

我有这个循环,在Swift 2中按分区递减整数.

for var i = 128; i >= 1 ; i = i/2  {
   //do some thing
}
Run Code Online (Sandbox Code Playgroud)

不推荐使用C风格的for循环,那么如何将其转换为Swift 3.0呢?

Mar*_*n R 6

具有非恒定步幅的相当一般循环可以通过以下方式实现sequence:

for i in sequence(first: 128, next: { $0 >= 2 ? $0/2 : nil }) {
    print(i)
}
Run Code Online (Sandbox Code Playgroud)
  • 优点:循环变量i是常量,其范围仅限于循环体.
  • 可能的缺点:必须调整终止条件(此处:$0 >= 2代替i >= 1),并且对于第一个值,循环始终至少执行一次.

还可以编写一个类似C-style for循环的包装器,并且没有列出的缺点(受Erica Sadun启发:有状态循环和序列):

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)
}
Run Code Online (Sandbox Code Playgroud)

然后用它作为

for i in sequence(first: 128, while: { $0 >= 1 }, next: { $0 / 2 }) {
    print(i)
}
Run Code Online (Sandbox Code Playgroud)