出於好奇平原,在迅速:整數乘法的雙和存儲結果作爲雙
var a:Double = 3.5
var b:Int = 4
var c = a * Double(b)
var d:Double = a * b
爲什麼d
無效,但c
是什麼?由於我指定d
是一個雙精度型,編譯器是否應該檢測到b
應該是雙精度型?
出於好奇平原,在迅速:整數乘法的雙和存儲結果作爲雙
var a:Double = 3.5
var b:Int = 4
var c = a * Double(b)
var d:Double = a * b
爲什麼d
無效,但c
是什麼?由於我指定d
是一個雙精度型,編譯器是否應該檢測到b
應該是雙精度型?
在Swift中,您必須明確轉換爲類型,而不是轉換它。 See the document。
由於每種數字類型都可以存儲不同範圍的值,因此您必須逐個選擇數字類型轉換。這種選擇加入方式可以防止隱藏的轉換錯誤,並有助於在代碼中顯式地使用類型轉換意圖。
當你有b:Int
,可以Double(b)
,因爲它的轉化率從Int
到Double
,但你不能b as Double
或c: Double = b
因爲它的鑄造。
至於var d:Double = a * b
,但問題是,有沒有它接受Double
和Int
作爲操作數,並返回Double
*
符實現。
如果你願意,你可以實現重載操作:
func *(lhs:Double, rhs:Int) -> Double {
return lhs * Double(rhs)
}
var d:Double = a * b // -> 14
但我不建議這樣做。您應該做明確的轉換。
除非是非常精確的情況,否則Swift不會執行自動類型轉換,因此,在混合算術類型時,您必須明確處理轉換。
應該注意這是_intentional_。這不是一個缺少的功能或錯誤,如果你抱怨,Apple不會添加它。 – gnasher729 2015-02-07 08:51:24
- 問題是沒有接受'Double'和'Int'作爲操作數並返回'Double'的'*'操作符實現。我認爲這是我正在尋找的答案,但對於爲什麼不是這樣的情況感到好奇。 – 2015-02-07 06:59:24
從文檔中添加引用。也許這是回答你的問題? – rintaro 2015-02-07 07:08:35
太棒了!這有幫助。非常感謝。 – 2015-02-07 07:38:50