通常來(lái)講,即使代碼中的整數(shù)常量和變量已知非負(fù),也請(qǐng)使用Int類型。總是使用默認(rèn)的整數(shù)類型可以保證你的整數(shù)常量和變量可以直接被復(fù)用并且可以匹配整數(shù)類字面量的類型推斷。 只有在必要的時(shí)候才使用其他整數(shù)類型,比如要處理外部的長(zhǎng)度明確的數(shù)據(jù)或者為了優(yōu)化性能、內(nèi)存占用等等。使用顯式指定長(zhǎng)度的類型可以及時(shí)發(fā)現(xiàn)值溢出并且可以暗示正在處理特殊數(shù)據(jù)。
不同整數(shù)類型的變量和常量可以存儲(chǔ)不同范圍的數(shù)字。Int8類型的常量或者變量可以存儲(chǔ)的數(shù)字范圍是-128~127,而UInt8類型的常量或者變量能存儲(chǔ)的數(shù)字范圍是0~255。如果數(shù)字超出了常量或者變量可存儲(chǔ)的范圍,編譯的時(shí)候會(huì)報(bào)錯(cuò):
let cannotBeNegative: UInt8 = -1
// UInt8 類型不能存儲(chǔ)負(fù)數(shù),所以會(huì)報(bào)錯(cuò)
let tooBig: Int8 = Int8.max + 1
// Int8 類型不能存儲(chǔ)超過(guò)最大值的數(shù),所以會(huì)報(bào)錯(cuò)
由于每種整數(shù)類型都可以存儲(chǔ)不同范圍的值,所以你必須根據(jù)不同情況選擇性使用數(shù)值型類型轉(zhuǎn)換。這種選擇性使用的方式,可以預(yù)防隱式轉(zhuǎn)換的錯(cuò)誤并讓你的代碼中的類型轉(zhuǎn)換意圖變得清晰。
要將一種數(shù)字類型轉(zhuǎn)換成另一種,你要用當(dāng)前值來(lái)初始化一個(gè)期望類型的新數(shù)字,這個(gè)數(shù)字的類型就是你的目標(biāo)類型。在下面的例子中,常量twoThousand是UInt16類型,然而常量one是UInt8類型。它們不能直接相加,因?yàn)樗鼈冾愋筒煌K砸{(diào)用UInt16(one)來(lái)創(chuàng)建一個(gè)新的UInt16數(shù)字并用one的值來(lái)初始化,然后使用這個(gè)新數(shù)字來(lái)計(jì)算:
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
現(xiàn)在兩個(gè)數(shù)字的類型都是UInt16,可以進(jìn)行相加。目標(biāo)常量twoThousandAndOne的類型被推斷為UInt16,因?yàn)樗莾蓚€(gè)UInt16值的和。
SomeType(ofInitialValue)是調(diào)用 Swift 構(gòu)造器并傳入一個(gè)初始值的默認(rèn)方法。在語(yǔ)言內(nèi)部,UInt16有一個(gè)構(gòu)造器,可以接受一個(gè)UInt8類型的值,所以這個(gè)構(gòu)造器可以用現(xiàn)有的UInt8來(lái)創(chuàng)建一個(gè)新的UInt16。注意,你并不能傳入任意類型的值,只能傳入UInt16內(nèi)部有對(duì)應(yīng)構(gòu)造器的值。不過(guò)你可以擴(kuò)展現(xiàn)有的類型來(lái)讓它可以接收其他類型的值(包括自定義類型),請(qǐng)參考擴(kuò)展。
整數(shù)和浮點(diǎn)數(shù)的轉(zhuǎn)換必須顯式指定類型:
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi 等于 3.14159,所以被推測(cè)為 Double 類型
這個(gè)例子中,常量three的值被用來(lái)創(chuàng)建一個(gè)Double類型的值,所以加號(hào)兩邊的數(shù)類型須相同。如果不進(jìn)行轉(zhuǎn)換,兩者無(wú)法相加。
浮點(diǎn)數(shù)到整數(shù)的反向轉(zhuǎn)換同樣行,整數(shù)類型可以用Double或者Float類型來(lái)初始化:
let integerPi = Int(pi)
// integerPi 等于 3,所以被推測(cè)為 Int 類型
當(dāng)用這種方式來(lái)初始化一個(gè)新的整數(shù)值時(shí),浮點(diǎn)值會(huì)被截?cái)?。也就是說(shuō)4.75會(huì)變成4,-3.9會(huì)變成-3。
注意:
結(jié)合數(shù)字類常量和變量不同于結(jié)合數(shù)字類字面量。字面量3可以直接和字面量0.14159相加,因?yàn)閿?shù)字字面量本身沒有明確的類型。它們的類型只在編譯器需要求值的時(shí)候被推測(cè)。