【问题标题】:Converting a C-style for loop that uses division for the step to Swift 3将使用除法的 C 样式 for 循环转换为 Swift 3
【发布时间】:2016-10-06 18:44:46
【问题描述】:

我有这个循环,在 Swift 2 中按除法递减一个整数。

for var i = 128; i >= 1 ; i = i/2  {
   //do some thing
}

C 风格的 for 循环已弃用,如何将其转换为 Swift 3.0?

【问题讨论】:

    标签: swift for-loop swift3


    【解决方案1】:

    可以实现具有非恒定步幅的非常通用的循环 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)
    }
    

    【讨论】:

      【解决方案2】:

      MartinR 的解决方案非常通用且有用,应该成为您工具箱的一部分。

      另一种方法是改写你想要的:2 的幂从 7 到 0。

      for i in (0...7).reversed().map({ 1 << $0 }) {
          print(i)
      }
      

      【讨论】:

        【解决方案3】:

        我建议您应该使用while 循环来处理这种情况:

        var i = 128
        while i >= 1
        {
            // Do your stuff
            i = i / 2
        }
        

        【讨论】:

        • 我喜欢使用i /= 2 而不是i = i / 2
        猜你喜欢
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多