Skip to main content
 首页 » 操作系统

swift之关于 Swift : Execution was interrupted, 原因 : EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)

2024年01月01日38zhwl

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

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

请您参考如下方法:

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

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 之类的东西中以找到集合中的最大值,例如减少(a,0,最大))