关于Swift:执行被中断,原因:EXC_BAD_INSTRUCTION(代码= EXC_1386_INVOP,子代码= 0x0)

时间:2015-01-03 20:37:52

标签: swift

我正在学习编码所以我决定从Swift开始。我正在关注mac在here进行的巡视,我正在计算一个数字总和的部分,然后它会告诉你尝试做一个平均数字的函数。

func averageOf(numbers: Int...) -> Int {
    var sum = 0
    var total = 0
    var average = 0
    for number in numbers {
        sum += number
        total++
    } **Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)**
    average = sum/total
    return average
}

我做错了什么(我需要学习什么才能正确行事)?

2 个答案:

答案 0 :(得分:3)

我猜你没有参数调用你的函数,即:

averageOf()

变量参数允许这样做,numbers将是一个空数组。这将导致您尝试将未更改的总和除以未更改的总和(因为您将在numbers中没有元素的情况下绕过循环,因此将0除以0,而且你会得到一个被零除错误。

为防止出现这种情况,您可以要求用户提供至少一个号码:

func averageOf(first: Int, rest: Int...) -> Double {
    var sum = first
    var total = 1.0
    for number in rest {
        sum += number
        total++
    }
    return Double(sum)/total
}

这样,如果你尝试不带参数调用它,你就会遇到编译器错误。

BTW我改变了您的版本以返回Double而不是Int,您可能想要尝试使用这两个版本来查看原因。

(这种技术类似于声明标准的lib max函数,它至少需要2个参数:

func max<T : Comparable>(x: T, y: T) -> T

但是有3个或更多的重载版本:

func max<T : Comparable>(x: T, y: T, z: T, rest: T...) -> T

第一个版本的原因,而不是直接切换到至少需要两个版本的可变版本,然后您可以将其传递到reduce之类的内容以查找集合中的最大值,例如reduce(a, 0, max)

答案 1 :(得分:0)

对我来说,发生此错误是因为未设置隐式展开的属性。设置它可以解决问题。