1. 類型安全和類型推測 1> 類型安全 Swift 是一個 _類型安全(type safe)_ 的語言。類型安全的語言可以讓你清楚地知道代碼要處理的值的類型。如果你的代碼需要一個`String`,你絕對不可能不小心傳進去一個`Int`。 由於 Swift 是類型安全的,所以它會在編譯你的代碼時進行 ...
1. 類型安全和類型推測
1> 類型安全
Swift 是一個 _類型安全(type safe)_ 的語言。類型安全的語言可以讓你清楚地知道代碼要處理的值的類型。如果你的代碼需要一個`String`,你絕對不可能不小心傳進去一個`Int`。
由於 Swift 是類型安全的,所以它會在編譯你的代碼時進行 _類型檢查(type checks)_ ,並把不匹配的類型標記為錯誤。這可以讓你在開發的時候儘早發現並修複錯誤。
當你要處理不同類型的值時,類型檢查可以幫你避免錯誤。然而,這並不是說你每次聲明常量和變數的時候都需要顯式指定類型。
2> 類型推測
如果你沒有顯式指定類型,Swift 會使用 _類型推測(type inference)_ 來選擇合適的類型。有了類型推測,編譯器可以在編譯代碼的時候自動推測出表達式的類型。原理很簡單,只要檢查你賦的值即可。
因為有類型推測,和 C 或者 Objective-C 比起來 Swift 很少需要聲明類型。常量和變數雖然需要明確類型,但是大部分工作並不需要你自己來完成。
當你聲明常量或者變數並賦初值的時候類型推測非常有用。當你在聲明常量或者變數的時候賦給它們一個_字面量(literal value 或 literal)_ 即可觸發類型推測。(字面量就是會直接出現在你代碼中的值,比如`42`和`3.14159`。)
① 如果你給一個新常量賦值`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`類型。
2. 數值型字面量
1> 整數字面量可以被寫作:
* 一個十進位數(decimal),沒有首碼
* 一個二進位數(binary),首碼是`0b`
* 一個八進位數(octal),首碼是`0o`
* 一個十六進位數(hexadecimal),首碼是`0x`
例: 下麵的所有整數字面量的十進位值都是`17`:
1 let decimalInteger = 17 2 3 let binaryInteger = 0b10001 // 二進位的17 4 5 let octalInteger = 0o21 // 八進位的17 6 7 let hexadecimalInteger = 0x11 // 十六進位的17
2> 浮點數字面量
① 浮點字面量可以是十進位(沒有首碼)或者是十六進位(首碼是`0x`)。小數點兩邊必須有至少一個十進位數字(或者是十六進位的數字)。
② 浮點字面量還有一個可選的 _指數(exponent)_ ,在十進位浮點數中通過大寫或者小寫的`e`來指定,在十六進位浮點數中通過大寫或者小寫的`p`來指定。
如果一個十進位數的指數為`exp`,那這個數相當於 基數和$10^{exp}$的乘積:
* `1.25e2` 表示 $1.25 × 10^{2}$,等於 `125.0`。
* `1.25e-2` 表示 $1.25 × 10^{-2}$,等於 `0.0125`。
如果一個十六進位數的指數為`exp`,那這個數相當於 基數和$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
3> 額外的格式
數值類字面量可以包括額外的格式來增強可讀性。整數和浮點數都可以添加額外的零並且包含下劃線,並不會影響字面量:
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
3. 類型別名
_類型別名(type aliases)_ 就是給現有類型定義另一個名字。你可以使用`typealias`關鍵字來定義類型別名。
當你想要給現有類型起一個更有意義的名字時,類型別名非常有用。假設你正在處理特定長度的外部資源的數據:
typealias AudioSample = UInt16
定義了一個類型別名之後,你可以在任何使用原始名的地方使用別名:
var maxAmplitudeFound = AudioSample.min
// maxAmplitudeFound 現在是 0
本例中,`AudioSample`被定義為`UInt16`的一個別名。因為它是別名,`AudioSample.min`實際上是`UInt16.min`,所以會給`maxAmplitudeFound`賦一個初值`0`。