一尘不染

无法在end之前形成范围<开始在进行for循环之前检查范围?

swift

我遇到了我不太了解的快速代码更改。

var arr = []
for var i = 1; i <= arr.count; i += 1
{
    print("i want to see the i \(i)")
}

我有一个程序可以获取结果数组,该数组也可以为空。上面的for循环没有问题。现在,苹果要我将代码更改为以下代码。但是,如果数组为空,则会崩溃。

var arr = []
for i in 1...arr.count
{
   print("i want to see the i \(i)")
}

在执行类似的循环之前,真的需要先检查范围吗?

var arr = []
if (arr.count >= 1){
    for i in 1...arr.count
    {
        print("I want to see the i \(i)")
    }
}

有没有更聪明的解决方案?


阅读 168

收藏
2020-07-07

共1个答案

一尘不染

如果只想遍历集合,请使用for <element> in <collection>语法。

for element in arr {
    // do something with element
}

如果还需要在每次迭代时访问元素的索引,则可以使用enumerate()。由于索引基于零,因此索引将具有range
0..<arr.count

for (index, element) in arr.enumerate() {

    // do something with index & element

    // if you need the position of the element (1st, 2nd 3rd etc), then do index+1
    let position = index+1
}

您始终可以在每次迭代时向索引添加一个,以访问位置(获得的范围1..<arr.count+1)。

如果这些方法都不能解决您的问题,那么您可以使用范围0..<arr.count对数组的索引进行迭代,或者如@vacawama所说,可以使用范围1..<arr.count+1对位置进行迭代。

for index in 0..<arr.count {

    // do something with index
}

for position in 1..<arr.count+1 {

    // do something with position
}

0..<0不能为空数组而崩溃,就像0..<0只是一个空范围一样,1..<arr.count+1也不能为空数组而崩溃,1..<1也像一个空范围一样。

另请参阅@ vacawama的评论如下有关使用stride安全地做更多的自定义范围。例如(Swift 2语法):

let startIndex = 4
for i in startIndex.stride(to: arr.count, by: 1) {
    // i = 4, 5, 6, 7 .. arr.count-1
}

Swift 3语法:

for i in stride(from: 4, to: arr.count, by: 1) {
    // i = 4, 5, 6, 7 .. arr.count-1
}

这是startIndex开始该范围arr.count的数字,是该范围将保持在其下方的数字,并且1是步幅。如果数组中的元素少于给定的起始索引,则将永远不会进入循环。

2020-07-07