如何在Swift 2.2+中编写非C类for循环?

VYT*_*VYT 8 for-loop swift swift2

我更新了Xcode(7.3)并且有很多变化; 表达式的C-like将被弃用.举个简单的例子,

for var i = 0;  i <= array.count - 1;  i++
 {
      //something with array[i]
 } 
Run Code Online (Sandbox Code Playgroud)

如何编写这个清晰简单的C-like for-loop以符合新的变化?

for var i = 0, j = 1;  i <= array.count - 2 && j <= array.count - 1;  i++, j++
{
     //something with array[i] and array[j]
}  
Run Code Online (Sandbox Code Playgroud)

更新.还有一个变种

for var i = 0; i <= <array.count - 1; i++
{
    for var j = i + 1; j <= array.count - 1; j++
    {
        //something with array[i] and array[j]
    }
}
Run Code Online (Sandbox Code Playgroud)

和更多 ...

for var i = 0, j = 1, g = 2;  i <= array.count - 3 && j <= array.count - 2 &&   g <= array.count - 1;  i++, j++, g++
{
     //something with array[i] and array[j] and array[g]
} 
Run Code Online (Sandbox Code Playgroud)

Update2经过几次建议后,循环是优选的,所有情况的通用替换都比C-like for-loop的简单示例更复杂(适用于表达式).不需要每次都寻找新的方法.
例如:而不是

for var i = 0; i <= <array.count - 1; i++
{
    for var j = i + 1; j <= array.count - 1; j++
    {
        //something with array[i] and array[j]
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以用

var i = 0
while i < array.count
{
    var j = i + 1
    while j < array.count
    {
        //something with array[i] and array[j]
        j += 1
    }
    i += 1
}
Run Code Online (Sandbox Code Playgroud)

JAL*_*JAL 8

查尔的(旧的)答案会崩溃.你想要0..<array.count:

for index in 0..<array.count {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果你想要你的i/ jloop之类的东西你可以使用stride并获得i继承者:

for i in 0.stride(through: array.count, by: 1) {
    let j = i.successor()
    // ...
}
Run Code Online (Sandbox Code Playgroud)

只要确保检查i.successor()你是否超出界限.


Mar*_*n R 5

for var i = 0;  i <= array.count - 1;  i++ {
      //something with array[i]
 }
Run Code Online (Sandbox Code Playgroud)

在这里你根本不需要元素索引,所以你可以简单地枚举数组元素:

for elem in array {
    // Do something with elem ...
}
Run Code Online (Sandbox Code Playgroud)
for var i = 0, j = 1;  i <= array.count - 2 && j <= array.count - 1;  i++, j++ {
     //something with array[i] and array[j]
}
Run Code Online (Sandbox Code Playgroud)

要迭代成对的相邻元素,请使用zip()dropFirst():

for (x, y) in zip(array, array.dropFirst()) {
    // Do something with x and y ...
    print(x, y)
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 2
2 3
3 4
4 5

对于其他距离,请使用dropFirst(n):

for (x, y) in zip(array, array.dropFirst(3)) {
    // Do something with x and y ...
    print(x, y)
}
Run Code Online (Sandbox Code Playgroud)

输出:

1 4
2 5

可能有很多解决方案要做

for var i = 0; i <= <array.count - 1; i++ {
    for var j = i + 1; j <= array.count - 1; j++ {
        //something with array[i] and array[j]
    }
}
Run Code Online (Sandbox Code Playgroud)

没有C风格的for循环,这里有一个:

for (index, x) in array.enumerate() {
    for y in array.dropFirst(index + 1) {
        print(x, y)
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_* T. 1

最坏的情况,您可以将其转换为 while 循环。

var i = 0
var j = 1
while i <= array.count -2 && j <= array.count - 1 {
    // something
    i += 1
    j += 1
}
Run Code Online (Sandbox Code Playgroud)

- 编辑 -

因为你说,“对于所有比类似 C 的 for 循环的简单示例更复杂的情况,while 循环是更好的通用替换”......我觉得有必要扩展我的答案。我不想对一堆糟糕的代码负责......

在大多数情况下,有一个简单的 for-in 循环可以处理这种情况:

    for item in array {
        // do something with item
    }

    for (item1, item2) in zip(array, array[1 ..< array.count]) {
        // do something with item1 and item2
    }

    for (index, item1) in array.enumerate() {
        for item2 in array[index + 1 ..< array.count] {
            // do soemthing with item1 and item2
        }
    }
Run Code Online (Sandbox Code Playgroud)

对于最后一种情况,您可能有理由使用 for 外观,但这是一种极其罕见的边缘情况。

不要在代码中乱扔 for 循环。