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)
查尔的(旧的)答案会崩溃.你想要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()你是否超出界限.
Run Code Online (Sandbox Code Playgroud)for var i = 0; i <= array.count - 1; i++ { //something with array[i] }
在这里你根本不需要元素索引,所以你可以简单地枚举数组元素:
for elem in array {
// Do something with elem ...
}
Run Code Online (Sandbox Code Playgroud)
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] }
要迭代成对的相邻元素,请使用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
可能有很多解决方案要做
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] } }
没有C风格的for循环,这里有一个:
for (index, x) in array.enumerate() {
for y in array.dropFirst(index + 1) {
print(x, y)
}
}
Run Code Online (Sandbox Code Playgroud)
最坏的情况,您可以将其转换为 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 循环。
| 归档时间: |
|
| 查看次数: |
1998 次 |
| 最近记录: |