Swift中难以理解的错误

时间:2015-01-31 18:06:01

标签: swift swift-playground

这有效:

func averageOf(numbers: Int...) -> Float {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return Float(sum) / Float(numbers.count)
}
averageOf() // (not a number)
averageOf(42, 597, 12) // (217.0)

但这不是:

func averageOf(numbers: Int...) -> Float {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return Float(sum / numbers.count)
}
averageOf()
averageOf(42, 597, 12)

它在}行给出了这个错误:

Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

我偶然发现another question有相同的第一和第二段代码,作者显然没有得到相同的错误。

让我们删除该演员:

func averageOf(numbers: Int...) -> Float {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum / numbers.count
}
averageOf()
averageOf(42, 597, 12)

它给我这个错误,在分裂标志上:

Cannot invoke '/' with an argument list of type '(@lvalue Int, Int)'

如果我然后将函数的返回类型更改为Int

func averageOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum / numbers.count
}
averageOf()
averageOf(42, 597, 12)

我收到相同的EXC_BAD_INSTRUCTION错误。

如果我只投了numbers.count

func averageOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum / Float(numbers.count)
}
averageOf()
averageOf(42, 597, 12)

我在分区标志上收到此错误:

Cannot invoke 'init' with an argument list of type '(@lvalue Int, $T5)'

如果我将返回类型更改回Float,我也会收到此错误。

所有这一切对我都没有意义。这是Xcode邮寄,还是我错过了一些微妙的东西?

2 个答案:

答案 0 :(得分:3)

如前所述,第二个示例中的问题是由于在没有参数的情况下调用averageOf(),导致除以零。然而,第一个averageOf()工作,再次没有争论,为什么?让我补充一些细节。

在您报告的第一个案例中,您没有收到任何错误,并且averageOf()有效,因为您在分割前将两个Int个操作数转换为Float
Float个数字的世界中,0.0只是0的近似值。如果在Playground中尝试0.0 / 0.0,结果不会出现错误,而输出将是{ {1}}。

然而,在第二种情况下,你试图在转换为not a number之前将0除以0。因此,当执行除法时,我们仍处于Float数字的范围内。由于除以零(这里没有涉及近似值),结果是错误。如果您在Playground中尝试Int,则会收到错误。

0 / 0 vs Int行为未解释的所有其他情况都是由于Swift要求您在类型之间显式转换,即使另一种语言允许您隐式转换操作数

答案 1 :(得分:1)

由于您的函数调用averageOf(),会发生此错误。
如果您没有传递任何值,则会向变量参数numbers创建一个空数组。
它&# 39;因此count属性返回0。而你不能0。 这也是它说BAD_INSTRUCTION的原因。

如果从第二个代码示例中删除averageOf(),则可以正常运行。