我创建了一个计算最小和最大的函数。创建了一个数组,称为函数,但会引发错误:
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)")
答案 0 :(得分:1)
当从..<
到0
而不是array.count
遍历数组中的元素时,应尝试使用...
,后者试图获取与{{1 }}超出范围。
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
答案 1 :(得分:1)
您试图获取非法的index
数组,即Array[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
和array
功能:
func minMax(array: [Int]) -> (min: Int?, max: Int?) { (array.min(), array.max()) }