Swift數值型類型轉換
數值型類型轉換
通常來講,即使代碼中的整數常量和變量已知非負,也請使用Int
類型。總是使用默認的整數類型可以保證你的整數常量和變量可以直接被複用並且可以匹配整數類字面量的類型推斷。 只有在必要的時候才使用其他整數類型,比如要處理外部的長度明確的數據或者爲了優化性能、內存佔用等等。使用顯式指定長度的類型可以及時發現值溢出並且可以暗示正在處理特殊數據。
整數轉換
不同整數類型的變量和常量可以存儲不同範圍的數字。Int8
類型的常量或者變量可以存儲的數字範圍是-128
127
,而UInt8
類型的常量或者變量能存儲的數字範圍是0
255
。如果數字超出了常量或者變量可存儲的範圍,編譯的時候會報錯:
let cannotBeNegative: UInt8 = -1
// UInt8 類型不能存儲負數,所以會報錯
let tooBig: Int8 = Int8.max + 1
// Int8 類型不能存儲超過最大值的數,所以會報錯
由於每種整數類型都可以存儲不同範圍的值,所以你必須根據不同情況選擇性使用數值型類型轉換。這種選擇性使用的方式,可以預防隱式轉換的錯誤並讓你的代碼中的類型轉換意圖變得清晰。
要將一種數字類型轉換成另一種,你要用當前值來初始化一個期望類型的新數字,這個數字的類型就是你的目標類型。在下面的例子中,常量twoThousand
是UInt16
類型,然而常量one
是UInt8
類型。它們不能直接相加,因爲它們類型不同。所以要調用UInt16(one)
來創建一個新的UInt16
數字並用one
的值來初始化,然後使用這個新數字來計算:
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
現在兩個數字的類型都是UInt16
,可以進行相加。目標常量twoThousandAndOne
的類型被推斷爲UInt16
,因爲它是兩個UInt16
值的和。
SomeType(ofInitialValue)
是調用 Swift 構造器並傳入一個初始值的默認方法。在語言內部,UInt16
有一個構造器,可以接受一個UInt8
類型的值,所以這個構造器可以用現有的UInt8
來創建一個新的UInt16
。注意,你並不能傳入任意類型的值,只能傳入UInt16
內部有對應構造器的值。不過你可以擴展現有的類型來讓它可以接收其他類型的值(包括自定義類型),請參考擴展。
整數和浮點數轉換
整數和浮點數的轉換必須顯式指定類型:
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi 等於 3.14159,所以被推測爲 Double 類型
這個例子中,常量three
的值被用來創建一個Double
類型的值,所以加號兩邊的數類型須相同。如果不進行轉換,兩者無法相加。
浮點數到整數的反向轉換同樣行,整數類型可以用Double
或者Float
類型來初始化:
let integerPi = Int(pi)
// integerPi 等於 3,所以被推測爲 Int 類型
當用這種方式來初始化一個新的整數值時,浮點值會被截斷。也就是說4.75
會變成4
,-3.9
會變成-3
。
注意:
結合數字類常量和變量不同於結合數字類字面量。字面量3
可以直接和字面量0.14159
相加,因爲數字字面量本身沒有明確的類型。它們的類型只在編譯器需要求值的時候被推測。