关于 Swift:执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)

Posted

技术标签:

【中文标题】关于 Swift:执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)【英文标题】:About Swift: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0) 【发布时间】:2015-01-03 20:37:51 【问题描述】:

我刚刚学习编码,所以我决定从 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

我做错了什么(我需要学习什么才能做对)?

【问题讨论】:

【参考方案1】:

我猜你是在没有参数的情况下调用了你的函数,也就是说:

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

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

顺便说一句,我更改了您的版本以返回 Double 而不是 Int,您可能想对这两个版本进行试验以了解原因。

(这种技术类似于标准库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))

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于关于 Swift:执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)的主要内容,如果未能解决你的问题,请参考以下文章

Swift JSONDecoder 解码错误:错误:执行被中断,原因:EXC_BAD_ACCESS (code=1, address=0x5e48)

Swift 扩展异常执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

错误:执行被中断,原因:断点 1.2。 Xcode 7.1,斯威夫特

快速添加:执行被中断,原因:EXC_BAD_INSTRUCTION (Code=EXC_l386_INVOP, subcode=0x0)

Swift:错误:在隐式展开可选值时意外发现 nil

模糊的操场错误:执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)