提问者:小点点

打印错误致命错误:数组索引超出范围


我创建了一个计算最小值和最大值的函数。 创建了一个数组,称为函数,但引发错误:

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)")

共2个答案

匿名用户

您试图获取数组的非法索引,即数组[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)")

您可以考虑使用数组的默认minmax函数:

func minMax(array: [Int]) -> (min: Int?, max: Int?) { (array.min(), array.max()) }

匿名用户

在从0array.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())