8
A
回答
12
是的,我也發現這很令人驚訝。 Double
符合FloatLiteralConvertible
和IntegerLiteralConvertible
(Swift 3中的ExpressibleByFloatLiteral
和ExpressibleByIntegerLiteral
)。因此一個 Double
可以與浮點文字進行初始化
let a = 3.0
或與整數字面:
let b : Double = 10
(這同樣適用於其他浮點類型,如Float
和 CGFloat
真)
現在它可能是意想不到的對我們所有人來說有(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 &%$!?)
不同,其進行整數除法並將結果轉換爲Double
。 Double
有一個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
。再次,/
必須是浮點除法運算符,因此10
和3
被視爲Double
常量。
因此,表達式等價於
(Double(10)/3.0) - (Double(10)/Double(3))
和的計算結果爲0.0
。如果改變了表達
(10/3.0) - Double(10/3)
那麼結果是0.333...
因爲在這種情況下,10/3
是兩個整常數的劃分,如以上所解釋。
相關問題
- 1. 奇怪斯威夫特4型系統
- 2. 斯威夫特3鑄造問題 - AudioQueue
- 3. 斯威夫特鑄造關閉?
- 4. 奇怪向下鑄造數組元素未能在斯威夫特3
- 5. 奇怪的邊境 - 斯威夫特
- 6. 斯威夫特奇怪的後退按鈕文字加
- 7. 奇怪的JavaScript類型鑄造
- 8. 類型鑄造的奇怪行爲
- 9. 斯威夫特 - 鑄造的Int64到AnyObject爲NSMutableArray的
- 10. 斯威夫特轉換斯威夫特
- 11. 斯威夫特2斯威夫特3
- 12. 斯威夫特 - JSQMessagesViewController與斯威夫特
- 13. 斯威夫特鑄造錯誤的,不應該有
- 14. 對象鑄造/的ObjectiveC從斯威夫特
- 15. 斯威夫特FUNC參數怪異
- 16. 斯威夫特:未聲明的類型
- 17. 奇怪結果與類型鑄造
- 18. NSUndoManager斯威夫特代碼鑄造NSUndoManagerProxy崩潰
- 19. 鑄造火力地堡快照斯威夫特3對象
- 20. 鑄造在斯威夫特工作不正常
- 21. INT到UInt(反之亦然)位在斯威夫特鑄造
- 22. 夫特2型鑄造字典
- 23. 斯威夫特:在泛型類
- 24. 斯威夫特通用引用類型
- 25. 斯威夫特:引用泛型類
- 26. 斯威夫特可選類型語法
- 27. 斯威夫特宏觀等同類型
- 28. 斯威夫特
- 29. 斯威夫特
- 30. 斯威夫特
很好的解釋! – 2015-03-02 16:00:47