将循环语句重构为swift 3.0

将循环语句重构为swift 3.0,swift,Swift,我的代码中有以下行: for (i = 0, j = count - 1; i < count; j = i++) for(i=0,j=count-1;iInt{ 返回值(自身+计数-1)%count } } 对于0..中的i,可以使用helper函数将j的包装抽象为: func go(count: Int, block: (Int, Int) -> ()) { if count < 1 { return } block(0, count - 1) for i i

我的代码中有以下行:

for (i = 0, j = count - 1; i < count; j = i++)
for(i=0,j=count-1;i
是否有人可以帮助删除这两个编译器警告,即Swift 3.0中将删除
i++和
C-style for语句已贬值?

您可以使用以下方法:

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
}
var j=count-1

对于0中的i..或者,让我们疯狂地避免将
j
声明为循环范围外部

片段1
let count=10

对于[count-1..中的(i,j)试图赢得该线程中最疯狂的解决方案奖

片段1
extension Int{
func j(计数:Int)->Int{
返回值(自身+计数-1)%count
}
}

对于0..中的i,可以使用helper函数将
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)
  }
}
func go(计数:Int,块:(Int,Int)->()){
如果计数<1{return}
块(0,计数-1)
因为我在1..<计数{
区块(i,i-1)
}
}

本问答中的许多示例:延迟的大量使用
。⚠️ 注意:
defer
用于安全清理,因此无论其封闭范围如何退出,都将执行。将(forInit;forTest;forNext){…}
替换为
forInit;而forTest{defer{forNext}…}
将给出不同的行为:a)延迟块在从循环中断时执行,因此迭代器变量的状态不再与满足循环退出条件时的状态相同;b)如果通过异常退出,则延迟块将被执行,这在不太可能的情况下是一个问题atement有副作用。@t首先,这是正确的,但当然你不必盲目复制和粘贴代码而不了解它的含义。这只是工具箱中的另一个工具,在大多数情况下,它是一个干净而优雅的解决方案。@AlessandroOrrùre:“盲目复制和粘贴代码而不了解它的含义”-你希望每个人都能理解吗?统计上不太可能。好的结构可以减少认知负荷,并且不需要开发人员对错误表现出比现在更强烈的热情。如果没有我上面的警告性评论,不经意的读者可能会认为,
延迟
会做他们想做的事情-一些人会重复检查,其他人会重复检查不会,并且错误场景可能不会显示,直到
延迟
的使用早已被遗忘。
延迟
在这里不是一个“干净”的解决方案-您必须小心地使用和记录它。@t首先,对不起,这不是针对您的。这是一个一般性的警告:不要盲目复制代码,尤其是像这样的简单行,而不理解它了解它的含义。对于这个问题或其他问题,每个“解决方案”都必须小心使用。无论如何,我编辑我的原始帖子,添加一个关于效果的注释。我的解决方案更疯狂:D@appzYourLife我觉得有必要升级这个;)我甚至不会以任何其他形式发布完全升级的代码片段#3,除了评论:)
(I,j)在(1-count..=0}).map(abs).enumerate(){print(i,j)}
@dfri:我相信代码混淆工具几乎不能比snippet#3:DI从第一个
flatMap
版本进行重构,编译器才能处理它(v.1;太复杂了:D)。谢谢你的乐趣,我实际上喜欢上面的代码片段1,扩展名ftw!
for (i, j) in (-1..<count-1).map({ $0 < 0 ? count-1 : $0 }).enumerate() {
    print(i, j)
}
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)
}
func go(count: Int, block: (Int, Int) -> ()) {
  if count < 1 { return }
  block(0, count - 1)
  for i in 1 ..< count {
    block(i, i - 1)
  }
}