2015-01-31 66 views
0

这工作:莫名其妙的错误,在斯威夫特

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与第一个和第二个代码片段相同,作者显然不会得到相同的错误ORS。

让我们删除该投:

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:如果我改变返回值类型回到Float

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

我也收到此错误:

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

我上除号此错误。

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

回答

3

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

在您报告的第一种情况下,您将得到没有错误,并且averageOf()的作品,因为您在投影前将两个Int操作数投射到Float
Float数字的世界中,0.0仅为0的近似值。如果您在Playground中尝试使用0.0/0.0,则不会因此产生错误,而输出将为not a number

然而,在第二种情况下,您试图在投射到Float之前将0除以0。因此,在划分执行时,我们仍然处于Int号码的范围内。由于被零除(这里不涉及近似值),结果是错误的。如果您在Playground中尝试0/0,则会出现错误。

Int vs Float行为没有解释的所有其他情况是由于Swift要求您明确地在类型之间进行转换,即使另一种语言可让您隐式转换操作数。

1

发生此错误,因为您的函数调用为averageOf()
如果您没有传递值,则返回可变参数numbers它将创建一个空数组。
这是count财产因此返回0。你不能按0来分类。 这也是它说BAD_INSTRUCTION的原因。

如果您从第二个代码示例中删除averageOf(),它将起作用。

+0

就是这样......谢谢。 – 2015-01-31 18:33:30