Swift 綜括了許多目前知名程式語言的特性,我對 Swift 的感想就是
潮
對 iOS developer 而言,只使用 Objc 也能完成所有的事情,
那為何還要學 Swift 呢? 因為潮嗎?這可能是其中一個原因,
但最主要的原因,是可以透過學習不同程式語言的特型來精進自己對於程式設計的觀念。
相信每個想要學 Swift 的人都會從 Apple 提供的 The Swift Programming Language 開始看起,
它是一本非常齊全的字典,但內容的範例或是某些介紹寫的不是太好,
常常會跳開原本在講解的東西或是交錯其他章節,
因此我針對每個章節列出我覺得重要或是特別的部分,希望能有幫助學習 Swift。
版本 :Swift 3.1
The Basic
常數 ( let ) 與變數 ( var )
原有的 Objc 並沒有這個概念,常數宣告後不能修改,變數可以。
型別宣告
後面會講到因為 Swift 有型別判斷,所以通常不需要宣告型別,Swift 也能辨識,
但是也是因為後面會講到的型別安全性,
最好還是宣告每個變數或常數的型別,因為能增加 code 的易讀性或 debug。
var message: String
型別安全與型別判斷
若定義變數或常數沒有宣告型別時,Swift 會根據值來判斷屬於哪個型別,
就像以下的 sample,雖然這個變數沒有宣告 String,但仍然會被判斷為 String 型別,
且若你指定了 String 以外的的值給此變數,會出現 error 警告。
var message = "Hello World"
又如以下的 sample,會自動被判斷為 Double
let num = 3 + 0.14159
數字轉換
因為 Swift 的型別安全,因此以下的 sample 會有 error,因為兩個不同型別無法正常相加處理。
let num1 = 0.5
let num2 = 1
let num3 = num1 + num2
需對 Int 轉換成 Double。
let num3 = num1 + Double(num2)
Bool
Objc 的 BOOL 是可以用不同的值來宣告並自行轉換成 true or false,
比如可以給數字 99 或是一個非空字串,都會是 YES,給 nil 會是 NO 的狀況,
但同樣因為型別安全,所以 Swift 的 Bool 一定只能給予 true or false,
Tuples
將多個值組合成一個值,且每個值可以是不同類別。
let myTuples: (Int, String) = (1, "1")
透過 Tuples 來取值
myTuples.0
myTuples.1
也可以對 Tuples 內的值來定義名稱並取值
let myTuples = (num: 1, name: "1")
myTuples.num
myTuples.name
也可以各自拆分成變數或常數
let (num, name): (Int, String) = (1, "1")
num
name
Optionals
了解 Optionals 用法前,必須要先了解 nil 在 Swift 的定義,Objc 也有 nil,但兩者代表的意義不同。
首先是 Objc 的 nil,Objc 的 nil 只能用在物件上, C Structure 如 NSInteger 無法指定 nil,
因為 Objc 的 nil 是一個 id 類別的指標變數,指向的位置值為 0,
以下的 sample 可以解釋成 test 這個指標指向 nil 指標,因此在取值的時候,會是 0。
NSObject *test = nil;
Swift 的 nil 是一種特殊型別的值,這種值只能指定給 Optionals,用來表示變數或常數沒有值的情形,
可以想像將變數或常數放在一個盒子內,你知道這個盒子裡面放的是什麼,但不知道裡面有沒有東西,
nil 就像是每個盒子外面有沒有掛鑰匙的意思,
有鑰匙代表裡面有東西可以打開,
沒鑰匙代表裡面沒有東西所以打不開。
基本的 Optionals 宣告如下,在沒有初始值時,所有 Optionals 的值都是 nil,也可以隨時將它設為 nil。
var test: String?
test = "abc"
test = nil
Optionals 可以是 function 的回傳值,
例如 Int(),這個 function 原本是回傳一個 Int 型別的值,
但如果傳入無法轉換成 Int 的參數時,會回傳 Optionals 值為 nil。
Int("abc")
真正的值是放在 Optionals 這個盒子內,若要取得值就必須打開它,
如之前所述,每個盒子都會有一個有沒有鑰匙的狀態,沒有鑰匙就無法打開它,
沒有鑰匙硬打開盒子就像要打開 nil 的 Optionals 一樣,因此就會發生 error。
let num: Int? = 123
num!
你也可以透過 if 來打開 Optionals,如果 Optionals 是 nil 的話就不會進入判斷。
let num: Int? = 123
if let index = num {
index
}
有些情況下已經很確定箱子裡一定有東西,可以在宣告 Optionals 的時候直接讓它是開啟狀態,
但它仍然是 Optionals,所以還是可以對他設定 nil。
var num: Int! = 123
num
num = nil