2015-03-02 78 views

回答

12

是的,我也發現這很令人驚訝。 Double符合FloatLiteralConvertibleIntegerLiteralConvertible(Swift 3中的ExpressibleByFloatLiteralExpressibleByIntegerLiteral)。因此一個 Double可以與浮點文字進行初始化

let a = 3.0 

或與整數字面

let b : Double = 10 

(這同樣適用於其他浮點類型,如FloatCGFloat真)

現在它可能是意想不到的對我們所有人來說有(Objective-)C背景 這兩條語句

let x : Double = 10/4  // x = 2.5 . Really? Yes! 
let y = 10/4 as Double // Same here ... 

分配值0.25的變量。從上下文來看, 分區的結果必須是Double,並且Swift不會隱式轉換類型。 因此/必須是浮點除法運算符

func /(lhs: Double, rhs: Double) -> Double 

所以編譯器創建從文字 「10」和「4」的兩個參數爲Double秒。 (如果10/4分別爲兩個整數 的分割處理,然後其結果也將是一個整數,並且不能被分配 到Double。)

注意,這是從

let z = Double(10/4) // z = 2.0 . (I just thought that I understood it &%$!?) 

不同,其進行整數除法並將結果轉換爲DoubleDouble有一個init(_ v: Int)構造函數,因此10/4 可以在這裏被視爲兩個整數的劃分。

它真的看起來有點怪怪的,如果我們把這些結果總結:

let x : Double = 10/4  // x = 2.5 
let y = 10/4 as Double // y = 2.5 
let z = Double(10/4)  // z = 2.0 

現在,我們可以將這些結果與你的表達

(10/3.0) - (10/3) 

第一部分(10/3.0)只能是Double,因此- 必須是浮點減法運算符

func -(lhs: Double, rhs: Double) -> Double 

因此(10/3)也必須是Double。再次,/必須是浮點除法運算符,因此103被視爲Double常量。

因此,表達式等價於

(Double(10)/3.0) - (Double(10)/Double(3)) 

和的計算結果爲0.0。如果改變了表達

(10/3.0) - Double(10/3) 

那麼結果是0.333...因爲在這種情況下,10/3 是兩個整常數的劃分,如以上所解釋。

+2

很好的解釋! – 2015-03-02 16:00:47