将for循环语句重构为swift 3.0

时间:2016-07-13 14:35:44

标签: swift

我的代码中有以下行:

for (i = 0, j = count - 1; i < count; j = i++)

任何人都可以帮助删除i++ will be removed in Swift 3.0C-style for statement is depreciated的两个编译器警告吗?

4 个答案:

答案 0 :(得分:5)

你可以用这个:

var j = count-1
for i in 0..<count {
    defer { j = i } // This will keep the cycle "logic" all together, similarly to "j = i++"

    // Cycle body
}

修改

正如@ t0rst所指出的那样,使用defer时要小心,因为无论退出封闭范围如何都会执行,因此不能100%替换。

因此,如果循环内有for ( forInit ; forTest ; forNext ) { … }语句,标准forNext执行breakreturn或异常,defer会。

Read here for more

答案 1 :(得分:1)

或者,让我们发疯,以避免必须将j声明为循环范围的外部!

Snippet 1

let count = 10

for (i, j) in [count-1..<count, 0..<count-1].flatten().enumerate() {
    print(i, j)
}
/* 0 9
   1 0
   2 1
   3 2
   4 3
   5 4
   6 5
   7 6
   8 7
   9 8 */

Snippet 2

for (i, j) in (-1..<count-1).map({ $0 < 0 ? count-1 : $0 }).enumerate() {
    print(i, j)
}

答案 2 :(得分:1)

试图赢得此线程中最疯狂的解决方案的奖品

Snippet 1

extension Int {
    func j(count:Int) -> Int {
        return (self + count - 1) % count
    }
}

for i in 0..<count {
    print(i, i.j(count))
}

Snippet 2

let count = 10
let iList = 0..<count
let jList = iList.map { ($0 + count - 1) % count }

zip(iList, jList).forEach { (i, j) in
    print(i, j)
}

答案 3 :(得分:1)

您可以使用辅助函数将j的包装抽象为:

func go(count: Int, block: (Int, Int) -> ()) {
  if count < 1 { return }
  block(0, count - 1)
  for i in 1 ..< count {
    block(i, i - 1)
  }
}