swift - 将对步骤使用除法的 C 样式 for 循环转换为 Swift 3

标签 swift for-loop swift3

我有这个循环,在 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/

相关文章:

c++ - 为什么变量在 for 循环中更改后没有更改?

ios - 类型 'Any' 的值没有成员 'removeFromSuperview'

ios - 在 swift 4 中使用 firebase 实时数据库进行实时运输跟踪

swift - 在 Swift 中递归更改字典中的某些键

objective-c - 将请求 URL 实现到使用 WordNik API 的导入的 cocapod

ios - 在 Swift 3.0 中实现没有导航栏的滑动返回导航

ios - 在 Swift 中的 Apple map 上添加标记标签

ios - 如何修复此错误 : 'Foundation._GenericObjCError error 0. '

c# - 如何将顺序打印语句与嵌套 for 循环分开?

r - 删除R中不同数据集中的多列