我遇到了我不太了解的快速代码更改。
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)") } }
有没有更聪明的解决方案?
如果只想遍历集合,请使用for <element> in <collection>语法。
for <element> in <collection>
for element in arr { // do something with element }
如果还需要在每次迭代时访问元素的索引,则可以使用enumerate()。由于索引基于零,因此索引将具有range 0..<arr.count。
enumerate()
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)。
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也像一个空范围一样。
0..<0
1..<1
另请参阅@ vacawama的评论如下有关使用stride安全地做更多的自定义范围。例如(Swift 2语法):
stride
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是步幅。如果数组中的元素少于给定的起始索引,则将永远不会进入循环。
startIndex
arr.count
1