【问题标题】:About Swift: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)关于 Swift:执行被中断,原因: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
}

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

【问题讨论】:

    标签: swift


    【解决方案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】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多