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

时间:2020-06-20 10:22:25

标签: ios arrays swift

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

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 个答案:

答案 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()实现

您可以考虑使用min的默认maxarray功能:

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