我的代码中有以下行:
for (i = 0, j = count - 1; i < count; j = i++)
任何人都可以帮助删除i++ will be removed in Swift 3.0
和C-style for statement is depreciated
的两个编译器警告吗?
答案 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
将不执行break
,return
或异常,defer
会。
答案 1 :(得分:1)
或者,让我们发疯,以避免必须将j
声明为循环范围的外部!
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 */
for (i, j) in (-1..<count-1).map({ $0 < 0 ? count-1 : $0 }).enumerate() {
print(i, j)
}
答案 2 :(得分:1)
试图赢得此线程中最疯狂的解决方案的奖品
extension Int {
func j(count:Int) -> Int {
return (self + count - 1) % count
}
}
for i in 0..<count {
print(i, i.j(count))
}
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)
}
}