Swift里快骗,數(shù)字分為整數(shù)(例如:1 / 10 / 100 / 1000等)和浮點數(shù)(例如:3.14 / 1.44 / 2.71等)表悬。我們先來看整數(shù)寺晌。
整數(shù) - Int & UInt
根據(jù)一個整數(shù)變量占據(jù)的內(nèi)存空間(8 / 16 / 32 / 64-bit)以及整數(shù)是否帶有符號(Unsinged),Swift一共定義了8種不同的整數(shù)類型:
Int8 Int16 Int32 Int64
UInt8 UInt16 UInt32 UInt64
第一行的四個類型,分別表示8 / 16 / 32 / 64-bit的有符號整數(shù)士鸥,第二行則是對應(yīng)的無符號整數(shù)類型。
但通常谆级,我們不會直接在代碼中使用這些具體的整數(shù)類型烤礁,我們只使用Int來定義有符號整數(shù),使用UInt來定義無符號整數(shù)肥照。Swift編譯器會根據(jù)目標編譯平臺脚仔,把Int或UInt轉(zhuǎn)換成對應(yīng)的整數(shù)類型。例如:
在我們的64位平臺上舆绎,我們分別使用min和max方法玻侥,來查看Int和Int64可以表達的數(shù)值范圍:
Int.min // -9223372036854775808
Int.max // 9223372036854775807
Int64.min // -9223372036854775808
Int64.max // 9223372036854775807
通過上面的對比,我們就能發(fā)現(xiàn)亿蒸,Int和Int64凑兰,它們可以表達的數(shù)值范圍,是一樣的边锁。
整數(shù)的常用表達方式
在Swift里姑食,我們可以使用多種方式來表達一個整數(shù)。包括使用10進制茅坛、16進制音半、8進制则拷、2進制:
//: Number literal
let fifteenInDecimal = 15
let fifteenInHex = 0xF
let fifteenInOctal = 0o17
let fifteenInBinary = 0b1111
以及,我們可以在數(shù)字中曹鸠,使用分隔符:
//: Number literal
let million = 1_000_000
“除非我們所在的硬件平臺有特別明確的需求需要我們使用UInt來定義無符號整數(shù)煌茬, 我們總是應(yīng)該盡可能使用Int來表達所有的整數(shù)類型,哪怕我們確定一個整數(shù)一定是一個非負數(shù)彻桃。 這會給我們減少很多不必要的類型轉(zhuǎn)換的麻煩坛善。”*
——最佳實踐
浮點數(shù) Float & Double
在Swift里邻眷,根據(jù)可以表達的精度范圍眠屎,有兩種不同的浮點數(shù)類型:
- Float: 最多表達6位精度的浮點數(shù);
- Double: 至少可以表達15位精度的浮點數(shù)肆饶;
我們用print
分別打印Float和Double:
var oneThirdInFloat: Float = 1/3
var oneThirdInDouble: Double 1/3
print(oneThirdInFloat) // 0.333333
print(oneThirdInDouble) // 0.333333333333333
除了使用常規(guī)的十進制表達浮點數(shù)之外改衩,我們還可以使用科學計數(shù)法。例如驯镊,表示浮點數(shù)PI:
var PI = 0.314e1
PI = 314e-2
“如不是有明確的需求葫督,我們應(yīng)該統(tǒng)一使用Double來定義浮點數(shù)“寤螅”*
——最佳實踐
和數(shù)字有關(guān)的Type Inference
在Swift里橄镜,我們使用一個整數(shù),編譯器會把它推導成Int洒放,使用一個浮點數(shù)蛉鹿,編譯器會把它推導成 Double,例如:
var three = 3
type(of: three) // Int.Type
var zeroPointForteen = 0.14
type(of: zeroPointForteen) // Double.Type
我們可以使用type(of:)
來查看一個變量的類型往湿,從上面的結(jié)果我們就可以看到three的類型是Int妖异, zeroPointForteen的類型是Double。
在Swift里领追,我們可以把不同類型數(shù)字的字面值直接進行運算:
PI = 3 + 0.14
type(of: PI)
我們可以看到他膳,整數(shù)值3和浮點數(shù)0.14可以直接相加,Swift把相加的結(jié)果轉(zhuǎn)換成一個Double绒窑。
但是棕孙,在Swift里,我們不能把不同數(shù)字類型的變量直接進行算數(shù)運算些膨,例如:
PI = three + zeroPointForteen
當對變量進行算數(shù)運算的時候蟀俊,所有變量的類型必須是相同的,如果變量類型不同订雾,我們必須明確將其中的一些變量進行類型轉(zhuǎn)換肢预。像這樣:
PI = Double(three) + zeroPointForteen
從上面的代碼可以看到,我們使用:
Double(Value)
把一個Int類型的three洼哎,"轉(zhuǎn)換"成了浮點數(shù)烫映。在這里沼本,之所以我們要對轉(zhuǎn)換加引號,是因為我們并沒有真的把three的類型從Int轉(zhuǎn)換成Double锭沟,而是用three的值抽兆,初始化了一個新的值為3的Double,并用這個新的Double和zeroPointForteen相加族淮。
What's next?
以上就是我們這一節(jié)的內(nèi)容辫红。在了解了不同整數(shù)和浮點數(shù)定義、用法以及type inference規(guī)則之后瞧筛,在下一節(jié)厉熟,我們將深入一個略顯復雜导盅,但是又非常重要的類型:String较幌。為了可以在unicode環(huán)境下正常工作,Swift中的String在設(shè)計上進行了諸多方面的考量白翻。我們在接下來的幾節(jié)中乍炉,就來了解它們。