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

3

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

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

C风格的for循环已经被弃用,那么我该如何将其转换为Swift 3.0?

3个回答

6

使用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)
}

3
我建议您使用一个while循环来处理这种情况:
var i = 128
while i >= 1
{
    // Do your stuff
    i = i / 2
}

1
我喜欢使用 i /= 2 而不是 i = i / 2 - rmaddy

3

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

另一个方法是重新表述您想要的内容:从7到0的二次幂。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接