我创建了一个计算最小值和最大值的函数。 创建了一个数组,称为函数,但引发错误:
Fatal error: Array index is out of range
Current stack trace:
0 libswiftCore.so 0x00007f685ed39920 _swift_stdlib_reportFatalError + 69
1 libswiftCore.so 0x00007f685ec47a06 <unavailable> + 3279366
2 libswiftCore.so 0x00007f685ec47d85 <unavailable> + 3280261
3 libswiftCore.so 0x00007f685ec65c83 <unavailable> + 3402883
4 libswiftCore.so 0x00007f685ea996a1 <unavailable> + 1517217
5 libswiftCore.so 0x00007f685ea5a289 <unavailable> + 1258121
6 libswiftCore.so 0x00007f685eb74d00 MutableCollection.subscript.getter + 235
7 main 0x0000563fff1260b3 <unavailable> + 45235
8 main 0x0000563fff124c23 <unavailable> + 39971
9 libc.so.6 0x00007f685dc18ab0 __libc_start_main + 231
10 main 0x0000563fff11d4ea <unavailable> + 9450
exited, illegal instruction
下面是我的代码:
func minMax(Array: [Int]) -> (min: Int, max: Int) {
var currentMin = Array[0]
var currentMax = Array[0]
for value in Array[1 ... Array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return(currentMin, currentMax)
}
let bounds = minMax(Array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
您试图获取数组的非法索引
,即数组[array.count]
,它不在范围内。
您应该考虑直接迭代数组的元素,以避免这些问题:
for value in Array {
,,,
}
此外,如果array[0]
上的数组为空,则可能会发生崩溃。 所以首先检查空数组条件。
因此重构后的代码将是:
func minMax(array: [Int]) -> (min: Int, max: Int) {
guard var currentMin = array.first else { fatalError("An empty array could not have min or max") } // Handle this error as you like
var currentMax = currentMin
for value in array {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return(currentMin, currentMax)
}
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
您可以考虑使用数组
的默认min
和max
函数:
func minMax(array: [Int]) -> (min: Int?, max: Int?) { (array.min(), array.max()) }
在从0
到array.Count
迭代数组中的元素时,应使用..
,该元素试图获取与array.Count
处的索引相对应的元素,该元素超出了界限。
func minMax(Array: [Int]) -> (min: Int, max: Int) {
if Array.isEmpty { fatalError("Empty array!!") } // or you could return (0, 0) if that's what you want.
var currentMin = Array[0]
var currentMax = Array[0]
for value in Array[1 ..< Array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return(currentMin, currentMax)
}
更好的方法:更好的方法是使用.min
和.max
属性:
func minMax(Array: [Int]) -> (min: Int?, max: Int?) { (Array.min(), Array.max())