Swift 數(shù)據(jù)類型

在我們使用任何程序語言編程時,需要使用各種數(shù)據(jù)類似來存儲不同的信息。

變量的數(shù)據(jù)類型決定了如何將代表這些值的位存儲到計算機的內(nèi)存中。在聲明變量時也可指定它的數(shù)據(jù)類型。

所有變量都具有數(shù)據(jù)類型,以決定能夠存儲哪種數(shù)據(jù)。


內(nèi)置數(shù)據(jù)類型

Swift 提供了非常豐富的數(shù)據(jù)類型,以下列出了常用了集中數(shù)據(jù)類型:

Int

一般來說,你不需要專門指定整數(shù)的長度。Swift 提供了一個特殊的整數(shù)類型Int,長度與當(dāng)前平臺的原生字長相同:

  • 在32位平臺上,IntInt32長度相同。
  • 在64位平臺上,IntInt64長度相同。

除非你需要特定長度的整數(shù),一般來說使用Int就夠了。這可以提高代碼一致性和可復(fù)用性。即使是在32位平臺上,Int可以存儲的整數(shù)范圍也可以達到-2,147,483,648~2,147,483,647,大多數(shù)時候這已經(jīng)足夠大了。

UInt

Swift 也提供了一個特殊的無符號類型UInt,長度與當(dāng)前平臺的原生字長相同:

  • 在32位平臺上,UIntUInt32長度相同。
  • 在64位平臺上,UIntUInt64長度相同。

注意:
盡量不要使用UInt,除非你真的需要存儲一個和當(dāng)前平臺原生字長相同的無符號整數(shù)。除了這種情況,最好使用Int,即使你要存儲的值已知是非負的。統(tǒng)一使用Int可以提高代碼的可復(fù)用性,避免不同類型數(shù)字之間的轉(zhuǎn)換,并且匹配數(shù)字的類型推斷,請參考類型安全和類型推斷

浮點數(shù)

浮點數(shù)是有小數(shù)部分的數(shù)字,比如3.141590.1-273.15。

浮點類型比整數(shù)類型表示的范圍更大,可以存儲比Int類型更大或者更小的數(shù)字。Swift 提供了兩種有符號浮點數(shù)類型:

  • Double表示64位浮點數(shù)。當(dāng)你需要存儲很大或者很高精度的浮點數(shù)時請使用此類型。
  • Float表示32位浮點數(shù)。精度要求不高的話可以使用此類型。

注意:
Double精確度很高,至少有15位數(shù)字,而Float最少只有6位數(shù)字。選擇哪個類型取決于你的代碼需要處理的值的范圍。

布爾值

Swift 有一個基本的布爾(Boolean)類型,叫做Bool。布爾值指邏輯上的值,因為它們只能是真或者假。Swift 有兩個布爾常量,true和false。

字符串

字符串是字符的序列集合,例如:

"Hello, World!"

字符

字符指的是單個字母,例如:

"C"

可選類型

使用可選類型(optionals)來處理值可能缺失的情況??蛇x類型表示有值或沒有值。


數(shù)值范圍

下表顯示了不同變量類型內(nèi)存的存儲空間,及變量類型的最大最小值:

類型 大小(字節(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)

類型別名

類型別名對當(dāng)前的類型定義了另一個名字,類型別名通過使用 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 是一個類型安全(type safe)的語言。

由于 Swift 是類型安全的,所以它會在編譯你的代碼時進行類型檢查(type checks),并把不匹配的類型標記為錯誤。這可以讓你在開發(fā)的時候盡早發(fā)現(xiàn)并修復(fù)錯誤。

import Cocoa

var varA = 42
varA = "This is hello"
print(varA)

以上程序,會在 Xcode 中報錯:

error: cannot assign value of type 'String' to type 'Int'
varA = "This is hello"

意思為不能將 'String' 字符串賦值給 'Int' 變量。


類型推斷

當(dāng)你要處理不同類型的值時,類型檢查可以幫你避免錯誤。然而,這并不是說你每次聲明常量和變量的時候都需要顯式指定類型。

如果你沒有顯式指定類型,Swift 會使用類型推斷(type inference)來選擇合適的類型。

例如,如果你給一個新常量賦值42并且沒有標明類型,Swift 可以推斷出常量類型是Int,因為你給它賦的初始值看起來像一個整數(shù):

let meaningOfLife = 42
// meaningOfLife 會被推測為 Int 類型

同理,如果你沒有給浮點字面量標明類型,Swift 會推斷你想要的是Double:

let pi = 3.14159
// pi 會被推測為 Double 類型

當(dāng)推斷浮點數(shù)的類型時,Swift 總是會選擇Double而不是Float。

如果表達式中同時出現(xiàn)了整數(shù)和浮點數(shù),會被推斷為Double類型:

let anotherPi = 3 + 0.14159
// anotherPi 會被推測為 Double 類型

原始值3沒有顯式聲明類型,而表達式中出現(xiàn)了一個浮點字面量,所以表達式會被推斷為Double類型。

實例

import Cocoa

// varA 會被推測為 Int 類型 
var varA = 42
print(varA)

// varB 會被推測為 Double 類型  
var varB = 3.14159
print(varB)

// varC 也會被推測為 Double 類型   
var varC = 3 + 0.14159
print(varC)

執(zhí)行以上代碼,輸出結(jié)果為:

42
3.14159
3.14159