# 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`可以提高代碼的可復用性,避免不同類型數字之間的轉換,并且匹配數字的類型推斷,請參考[類型安全和類型推斷](#type_safety_and_type_inference)。
### 浮點數
浮點數是有小數部分的數字,比如`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
typealias Feet = Int
var distance: Feet = 100
print(distance)
```
我們使用 playground 執行以上程序,輸出結果為:
```
100
```
## 類型安全
Swift 是一個類型安全(type safe)的語言。
由于 Swift 是類型安全的,所以它會在編譯你的代碼時進行類型檢查(type checks),并把不匹配的類型標記為錯誤。這可以讓你在開發的時候盡早發現并修復錯誤。
```
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' 變量。
## 類型推斷
當你要處理不同類型的值時,類型檢查可以幫你避免錯誤。然而,這并不是說你每次聲明常量和變量的時候都需要顯式指定類型。
如果你沒有顯式指定類型,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類型。
### 實例
```
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)
```
執行以上代碼,輸出結果為:
```
42
3.14159
3.14159
```
- Swift 簡介
- Swift 環境搭建
- Swift 基本語法
- Swift 數據類型
- Swift 變量
- Swift 可選(Optionals)類型
- Swift 常量
- Swift 字面量
- Swift 運算符
- Swift 條件語句
- Swift if 語句
- Swift if...else 語句
- Swift if...else if...else 語句
- Swift 嵌套 if 語句
- Swift switch 語句
- Swift 循環
- Swift for-in 循環
- Swift for 循環
- Swift While 循環
- Swift repeat...while 循環
- Swift Continue 語句
- Swift Break 語句
- Swift Fallthrough 語句
- Swift 字符串
- Swift 字符(Character)
- Swift 數組
- Swift 字典
- Swift 函數
- Swift 閉包
- Swift 枚舉
- Swift 結構體
- Swift 類
- Swift 屬性
- Swift 方法
- Swift 下標腳本
- Swift 繼承
- Swift 構造過程
- Swift 析構過程
- Swift 可選鏈
- Swift 自動引用計數(ARC)
- Swift 類型轉換
- Swift 擴展
- Swift 協議
- Swift 泛型
- Swift 訪問控制