Swift 資料類型
在程式語言程式設計時,需要使用各種資料類型來存儲不同的資訊。
變量的資料類型決定了如何将代表這些值的位存儲到計算機的記憶體中。在聲明變量時也可指定它的資料類型。所有變量都具有資料類型,以決定能夠存儲哪種資料。
内置資料類型
Swift 提供了非常豐富的資料類型,以下列出了常用了幾種資料類型:
Int
一般來說,不需要專門指定整數的長度。Swift 提供了一個特殊的整數類型Int,長度與目前平台的原生字長相同:
在32位平台上,Int和Int32長度相同。
在64位平台上,Int和Int64長度相同。
除非你需要特定長度的整數,一般來說使用Int就夠了。這可以提高代碼一緻性和可複用性。即使是在32位平台上,Int可以存儲的整數範圍也可以達到-2,147,483,648~2,147,483,647,大多數時候這已經足夠大了。
UInt
Swift 也提供了一個特殊的無符号類型UInt,長度與目前平台的原生字長相同:
在32位平台上,UInt和UInt32長度相同。
在64位平台上,UInt和UInt64長度相同。
注意:
盡量不要使用UInt,除非你真的需要存儲一個和目前平台原生字長相同的無符号整數。除了這種情況,最好使用Int,即使你要存儲的值已知是非負的。統一使用Int可以提高代碼的可複用性,避免不同類型數字之間的轉換,并且比對數字的類型推斷,請參考類型安全和類型推斷。
浮點數
浮點數是有小數部分的數字,比如3.14159,0.1和-273.15。
浮點類型比整數類型表示的範圍更大,可以存儲比Int類型更大或者更小的數字。Swift 提供了兩種有符号浮點數類型:
Double表示64位浮點數。當你需要存儲很大或者很高精度的浮點數時請使用此類型。
Float表示32位浮點數。精度要求不高的話可以使用此類型。
Double精确度很高,至少有15位數字,而Float最少隻有6位數字。選擇哪個類型取決于你的代碼需要處理的值的範圍。
布爾值
Swift 有一個基本的布爾(Boolean)類型,叫做Bool。布爾值指邏輯上的值,因為它們隻能是真或者假。Swift 有兩個布爾常量,true和false。
字元串
字元串是字元的序列集合,例如:
"Hello, World!"
字元
字元指的是單個字母,例如:
"C"
可選類型
使用可選類型(optionals)來處理值可能缺失的情況。可選類型表示有值或沒有值。
數值範圍
下表顯示了不同變量類型記憶體的存儲空間,及變量類型的最大最小值:
類型 大小(位元組) 區間值
Int8 1 位元組 -127 到 127
UInt8 1 位元組 0 到 255
Int32 4 位元組 -2147483648 到 2147483647
UInt32 4 位元組 0 到 4294967295
Int64 8 位元組 -9223372036854775808 到 9223372036854775807
UInt64 8 位元組 0 到 18446744073709551615
Float 4 位元組 1.2E-38 到 3.4E+38 (~6 digits)
Double 8 位元組 2.3E-308 到 1.7E+308 (~15 digits)
類型别名
類型别名對目前的類型定義了另一個名字,類型别名通過使用 typealias 關鍵字來定義。文法格式如下:
typealias newname = type
例如以下定義了 Int 的類型别名為 Feet:
typealias Feet = Int
現在,我們可以通過别名來定義變量:
import Cocoa
var distance: Feet = 100
print(distance)
我們使用 playground 執行以上程式,輸出結果為:
100
類型安全
Swift 是一個類型安全(type safe)的語言。
由于 Swift 是類型安全的,是以它會在編譯你的代碼時進行類型檢查(type checks),并把不比對的類型标記為錯誤。這可以讓你在開發的時候盡早發現并修複錯誤。
var varA = 42
varA = "This is hello"
print(varA)
以上程式,會在 Xcode 中報錯:
error: cannot assign value of type 'String' to type 'Int'
意思為不能将 'String' 字元串指派給 'Int' 變量。
類型推斷
當你要處理不同類型的值時,類型檢查可以幫你避免錯誤。然而,這并不是說你每次聲明常量和變量的時候都需要顯式指定類型。
如果你沒有顯式指定類型,Swift 會使用類型推斷(type inference)來選擇合适的類型。
例如,如果你給一個新常量指派42并且沒有标明類型,Swift 可以推斷出常量類型是Int,因為你給它賦的初始值看起來像一個整數:
let meaningOfLife = 42
// meaningOfLife 會被推測為 Int 類型
同理,如果你沒有給浮點字面量标明類型,Swift 會推斷你想要的是Double:
let pi = 3.14159
// pi 會被推測為 Double 類型
當推斷浮點數的類型時,Swift 總是會選擇Double而不是Float。
如果表達式中同時出現了整數和浮點數,會被推斷為Double類型:
let anotherPi = 3 + 0.14159
// anotherPi 會被推測為 Double 類型
原始值3沒有顯式聲明類型,而表達式中出現了一個浮點字面量,是以表達式會被推斷為Double類型。
執行個體
// varA 會被推測為 Int 類型
// varB 會被推測為 Double 類型
var varB = 3.14159
print(varB)
// varC 也會被推測為 Double 類型
var varC = 3 + 0.14159
print(varC)
執行以上代碼,輸出結果為:
42
3.14159