在我們使用任何程序語言編程時(shí)稻爬,需要使用各種數(shù)據(jù)類型來存儲(chǔ)不同的信息移层。
變量的數(shù)據(jù)類型決定了如何將代表這些值的位存儲(chǔ)到計(jì)算機(jī)的內(nèi)存中聂抢。在聲明變量時(shí)也可指定它的數(shù)據(jù)類型蒂窒。
所有變量都具有數(shù)據(jù)類型膀估,以決定能夠存儲(chǔ)哪種數(shù)據(jù)幔亥。
內(nèi)置數(shù)據(jù)類型
Swift 提供了非常豐富的數(shù)據(jù)類型,以下列出了常用了幾種數(shù)據(jù)類型:
Int
一般來說察纯,你不需要專門指定整數(shù)的長(zhǎng)度帕棉。Swift 提供了一個(gè)特殊的整數(shù)類型Int,長(zhǎng)度與當(dāng)前平臺(tái)的原生字長(zhǎng)相同:
在32位平臺(tái)上饼记,Int和Int32長(zhǎng)度相同笤昨。
在64位平臺(tái)上,Int和Int64長(zhǎng)度相同握恳。
除非你需要特定長(zhǎng)度的整數(shù)瞒窒,一般來說使用Int就夠了。這可以提高代碼一致性和可復(fù)用性乡洼。即使是在32位平臺(tái)上崇裁,Int可以存儲(chǔ)的整數(shù)范圍也可以達(dá)到-2,147,483,648~2,147,483,647,大多數(shù)時(shí)候這已經(jīng)足夠大了束昵。
UInt
Swift 也提供了一個(gè)特殊的無符號(hào)類型UInt拔稳,長(zhǎng)度與當(dāng)前平臺(tái)的原生字長(zhǎng)相同:
在32位平臺(tái)上,UInt和UInt32長(zhǎng)度相同锹雏。
在64位平臺(tái)上巴比,UInt和UInt64長(zhǎng)度相同。
注意:
盡量不要使用UInt礁遵,除非你真的需要存儲(chǔ)一個(gè)和當(dāng)前平臺(tái)原生字長(zhǎng)相同的無符號(hào)整數(shù)轻绞。除了這種情況,最好使用Int佣耐,即使你要存儲(chǔ)的值已知是非負(fù)的政勃。統(tǒng)一使用Int可以提高代碼的可復(fù)用性,避免不同類型數(shù)字之間的轉(zhuǎn)換兼砖,并且匹配數(shù)字的類型推斷奸远,請(qǐng)參考類型安全和類型推斷。
浮點(diǎn)數(shù)
浮點(diǎn)數(shù)是有小數(shù)部分的數(shù)字讽挟,比如3.14159懒叛,0.1和-273.15。
浮點(diǎn)類型比整數(shù)類型表示的范圍更大耽梅,可以存儲(chǔ)比Int類型更大或者更小的數(shù)字薛窥。Swift 提供了兩種有符號(hào)浮點(diǎn)數(shù)類型:
Double表示64位浮點(diǎn)數(shù)。當(dāng)你需要存儲(chǔ)很大或者很高精度的浮點(diǎn)數(shù)時(shí)請(qǐng)使用此類型褐墅。
Float表示32位浮點(diǎn)數(shù)拆檬。精度要求不高的話可以使用此類型洪己。
注意:
Double精確度很高,至少有15位數(shù)字竟贯,而Float最少只有6位數(shù)字答捕。選擇哪個(gè)類型取決于你的代碼需要處理的值的范圍。
布爾值
Swift 有一個(gè)基本的布爾(Boolean)類型屑那,叫做Bool拱镐。布爾值指邏輯上的值,因?yàn)樗鼈冎荒苁钦婊蛘呒俪旨省wift 有兩個(gè)布爾常量沃琅,true和false。
字符串
字符串是字符的序列集合蜘欲,例如:
"Hello, World!"
字符
字符指的是單個(gè)字母益眉,例如:
"C"
可選類型
使用可選類型(optionals)來處理值可能缺失的情況±逊荩可選類型表示有值或沒有值郭脂。
數(shù)值范圍
下表顯示了不同變量類型內(nèi)存的存儲(chǔ)空間,及變量類型的最大最小值:
類型 大谐呵浮(字節(jié)) 區(qū)間值
Int8 1 字節(jié) -127 到 127
UInt8 1 字節(jié) 0 到 255
Int32 4 字節(jié) -2147483648 到 2147483647
UInt32 4 字節(jié) 0 到 4294967295
Int64 8 字節(jié) -9223372036854775808 到 9223372036854775807
UInt64 8 字節(jié) 0 到 18446744073709551615
Float 4 字節(jié) 1.2E-38 到 3.4E+38 (~6 digits)
Double 8 字節(jié) 2.3E-308 到 1.7E+308 (~15 digits)
類型別名
類型別名對(duì)當(dāng)前的類型定義了另一個(gè)名字展鸡,類型別名通過使用 typealias 關(guān)鍵字來定義。語法格式如下:
typealias newname = type
例如以下定義了 Int 的類型別名為 Feet:
typealias Feet = Int
現(xiàn)在埃难,我們可以通過別名來定義變量:
import Cocoa
typealias Feet = Int
var distance: Feet = 100
print(distance)
我們使用 playground 執(zhí)行以上程序莹弊,輸出結(jié)果為:
100
類型安全
Swift 是一個(gè)類型安全(type safe)的語言。
由于 Swift 是類型安全的涡尘,所以它會(huì)在編譯你的代碼時(shí)進(jìn)行類型檢查(type checks)忍弛,并把不匹配的類型標(biāo)記為錯(cuò)誤。這可以讓你在開發(fā)的時(shí)候盡早發(fā)現(xiàn)并修復(fù)錯(cuò)誤悟衩。
import Cocoa
var varA = 42
varA = "This is hello"
print(varA)
以上程序剧罩,會(huì)在 Xcode 中報(bào)錯(cuò):
error: cannot assign value of type 'String' to type 'Int'
varA = "This is hello"
意思為不能將 'String' 字符串賦值給 'Int' 變量。
類型推斷
當(dāng)你要處理不同類型的值時(shí)座泳,類型檢查可以幫你避免錯(cuò)誤。然而幕与,這并不是說你每次聲明常量和變量的時(shí)候都需要顯式指定類型挑势。
如果你沒有顯式指定類型,Swift 會(huì)使用類型推斷(type inference)來選擇合適的類型啦鸣。
例如潮饱,如果你給一個(gè)新常量賦值42并且沒有標(biāo)明類型,Swift 可以推斷出常量類型是Int诫给,因?yàn)槟憬o它賦的初始值看起來像一個(gè)整數(shù):
let meaningOfLife = 42
// meaningOfLife 會(huì)被推測(cè)為 Int 類型
同理香拉,如果你沒有給浮點(diǎn)字面量標(biāo)明類型啦扬,Swift 會(huì)推斷你想要的是Double:
let pi = 3.14159
// pi 會(huì)被推測(cè)為 Double 類型
當(dāng)推斷浮點(diǎn)數(shù)的類型時(shí),Swift 總是會(huì)選擇Double而不是Float凫碌。
如果表達(dá)式中同時(shí)出現(xiàn)了整數(shù)和浮點(diǎn)數(shù)扑毡,會(huì)被推斷為Double類型:
let anotherPi = 3 + 0.14159
// anotherPi 會(huì)被推測(cè)為 Double 類型
原始值3沒有顯式聲明類型,而表達(dá)式中出現(xiàn)了一個(gè)浮點(diǎn)字面量盛险,所以表達(dá)式會(huì)被推斷為Double類型瞄摊。
實(shí)例
import Cocoa
// varA 會(huì)被推測(cè)為 Int 類型
var varA = 42
print(varA)
// varB 會(huì)被推測(cè)為 Double 類型
var varB = 3.14159
print(varB)
// varC 也會(huì)被推測(cè)為 Double 類型
var varC = 3 + 0.14159
print(varC)
執(zhí)行以上代碼,輸出結(jié)果為:
42
3.14159
3.14159