2015-01-31 67 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