这有效:
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邮寄,还是我错过了一些微妙的东西?
答案 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()
,则可以正常运行。