整數(shù)
整數(shù)就是沒有小數(shù)部分的數(shù)字汗唱,比如 42 和 -23 。整數(shù)可以是有符號(正丈攒、負哩罪、零)或者 無符號(正、零)巡验。
Swift 提供了 8际插,16,32 和 64 位的有符號和無符號整數(shù)類型显设。這些整數(shù)類型和 C 語言的命名方式很像框弛,比如 8 位無符號整數(shù)類型是 UInt8,32 位有符號整數(shù)類型是 Int32 捕捂。就像 Swift 的其他類型一樣瑟枫,整數(shù)類型采用大寫命名法。
你可以訪問不同整數(shù)類型的 min 和 max 屬性來獲取對應(yīng)類型的最小值和最大值:
let minValue = UInt8.min // minValue 為 0指攒,是 UInt8 類型
let maxValue = UInt8.max // maxValue 為 255慷妙,是 UInt8 類型
Int
一般來說,你不需要專門指定整數(shù)的長度允悦。Swift 提供了一個特殊的整數(shù)類型 Int膝擂,長度與當(dāng)前平臺的原生字長相同:
- 在 32 位平臺上,Int 和 Int32 長度相同隙弛。
- 在 64 位平臺上架馋,Int 和 Int64 長度相同。
除非你需要特定長度的整數(shù)全闷,一般來說使用 Int 就夠了叉寂。這可以提高代碼一致性和可復(fù)用性。即使是在 32 位平臺上总珠,Int 可以存儲的整數(shù)范圍也可以達到 -2,147,483,648 ~ 2,147,483,647 办绝,大多數(shù)時候這已經(jīng)足夠大了。
UInt
Swift 也提供了一個特殊的無符號類型 UInt姚淆,長度與當(dāng)前平臺的原生字長相同:
- 在32位平臺上,UInt 和 UInt32 長度相同屡律。
- 在64位平臺上腌逢,UInt 和 UInt64 長度相同。
注意:盡量不要使用 UInt超埋,除非你真的需要存儲一個和當(dāng)前平臺原生字長相同的無符號整數(shù)搏讶。除了這種情況佳鳖,最好使用 Int,即使你要存儲的值已知是非負的媒惕。統(tǒng)一使用 Int 可以提高代碼的可復(fù)用性系吩,避免不同類型數(shù)字之間的轉(zhuǎn)換,并且匹配數(shù)字的類型推斷
浮點數(shù)
浮點數(shù)是有小數(shù)部分的數(shù)字妒蔚,比如 3.14159 穿挨,0.1 和 -273.15。
浮點類型比整數(shù)類型表示的范圍更大肴盏,可以存儲比 Int 類型更大或者更小的數(shù)字科盛。Swift 提供了兩種有符號浮點數(shù)類型:
Double 表示 64 位浮點數(shù)。當(dāng)你需要存儲很大或者很高精度的浮點數(shù)時請使用此類型菜皂。
Float 表示 32 位浮點數(shù)贞绵。精度要求不高的話可以使用此類型。
注意:Double 精確度很高恍飘,至少有 15 位數(shù)字榨崩,而 Float 只有 6 位數(shù)字。選擇哪個類型取決于你的代碼需要處理的值的范圍章母,在兩種類型都匹配的情況下母蛛,將優(yōu)先選擇 Double。
Objective-c 與 Swift 基本數(shù)據(jù)類型對比
數(shù)值型類型轉(zhuǎn)換
通常來講胳施,即使代碼中的整數(shù)常量和變量已知非負溯祸,也請使用 Int 類型∥杷粒總是使用默認的整數(shù)類型可以保證你的整數(shù)常量和變量可以直接被復(fù)用并且可以匹配整數(shù)類字面量的類型推斷焦辅。
只有在必要的時候才使用其他整數(shù)類型,比如要處理外部的長度明確的數(shù)據(jù)或者為了優(yōu)化性能椿胯、內(nèi)存占用等等筷登。使用顯式指定長度的類型可以及時發(fā)現(xiàn)值溢出并且可以暗示正在處理特殊數(shù)據(jù)。
/// 整數(shù)轉(zhuǎn)換
let a: Int = 10
let b: UInt16 = 1_00
//let sum = a + b Swift中不同類型不能直接運算
let result = UInt16(a) + b // 110
/// 整數(shù)和浮點數(shù)轉(zhuǎn)換
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi 等于 3.14159哩盲,所以被推測為 Double 類型
// 常量 three 的值被用來創(chuàng)建一個 Double 類型的值前方,所以加號兩邊的數(shù)類型須相同。如果不進行轉(zhuǎn)換廉油,兩者無法相加惠险。
let integerPi = Int(pi)
// integerPi 等于 3,所以被推測為 Int 類型
// 當(dāng)用這種方式來初始化一個新的整數(shù)值時抒线,浮點值會被截斷班巩。也就是說 4.75 會變成 4,-3.9 會變成 -3嘶炭。(將大容量的東西放到小容量的地方會損失精度)
數(shù)值型字面量
整數(shù)字面量可以被寫作:
- 一個十進制數(shù)抱慌,沒有前綴
- 一個二進制數(shù)逊桦,前綴是0b
- 一個八進制數(shù),前綴是0o
- 一個十六進制數(shù)抑进,前綴是0x
let decimalInteger = 17
let binaryInteger = 0b10001 // 二進制的17
let octalInteger = 0o21 // 八進制的17
let hexadecimalInteger = 0x11 // 十六進制的17
浮點字面量可以是十進制(沒有前綴)或者是十六進制(前綴是 0x )强经。小數(shù)點兩邊必須有至少一個十進制數(shù)字(或者是十六進制的數(shù)字)。十進制浮點數(shù)也可以有一個可選的指數(shù)(exponent)寺渗,通過大寫或者小寫的 e 來指定匿情;十六進制浮點數(shù)必須有一個指數(shù),通過大寫或者小寫的 p 來指定户秤。
如果一個十進制數(shù)的指數(shù)為 exp码秉,那這個數(shù)相當(dāng)于基數(shù)和10^exp的乘積:
- 1.25e2 表示 1.25 × 10^2,等于 125.0鸡号。
- 1.25e-2 表示 1.25 × 10^-2转砖,等于 0.0125。
如果一個十六進制數(shù)的指數(shù)為exp鲸伴,那這個數(shù)相當(dāng)于基數(shù)和2^exp的乘積:
- 0xFp2 表示 15 × 2^2府蔗,等于 60.0。
- 0xFp-2 表示 15 × 2^-2汞窗,等于 3.75姓赤。
下面的這些浮點字面量都等于十進制的12.1875:
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
數(shù)值類字面量可以包括額外的格式來增強可讀性。整數(shù)和浮點數(shù)都可以添加額外的零并且包含下劃線仲吏,并不會影響字面量:
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
let num = 1_0000000
類型別名
類型別名(type aliases)就是給現(xiàn)有類型定義另一個名字不铆。你可以使用 typealias 關(guān)鍵字來定義類型別名。
// myInt 是 Int 的別名
typealias myInt = Int
let demo: myInt = 10