現在開始會越來越複雜,但我會想辦法用非常簡單的方式解釋原理讓你理解。
今天會學到
先講一下通常哪裡可以用到閉包
但現在你可能不懂API,UI元件等等,不緊張我後面的章節會介紹,沒關係我們先了解一下概念,以後多寫程式就會慢慢理解了。
閉包簡單來說就是沒有名稱的函式
(function),我們來比較一下兩者的差異
{ (參數1, 參數2) -> 回傳型別 in //這是closure的寫法
程式碼
}
func functionName(參數1, 參數2) -> 回傳型別 { //這是function的寫法
程式碼
}
下面簡單寫下沒有參數跟沒有回傳值的function跟closures的比較。
科普一下:因為閉包沒辦法像function單獨定義存在,所以如果要單獨建立一個閉包,會需要給他一個常數或變數空間儲存。
func functionName() -> () { //沒有參數跟回傳值的function
print("This is function!")
}
let closuresName = { () -> () in //沒有參數跟回傳值的closures,需要指派給常數變數才有辦法呼叫
print("This is closure")
}
let closuresName = { //因為沒有參數跟回傳,我們可以簡化上面的程式
print("This is closure")
}
尾隨閉包是當閉包當作function的參數時,呼叫function時可以簡化變成閉包表達式並且放在呼叫的function後面。
func test(name: String, closure: () -> Void) { //假設我們先設計一個函式,並且使用閉包當作參數
程式碼
}
test(name: "Roger", closure: { // 呼叫函式一般的寫法
// closure程式碼
})
test(name: "Roger") { // 呼叫函式時使用trailing closures
// closure程式碼
}
簡單來說就是簡化而已。
如果想要在function外面繼續使用closure傳入的參數
,就會用到escaping closures,像是我最後面提到的呼叫API之後還要把資料顯示在畫面上,這是非常好用的閉包哦!
其實用法很簡單跟Trailing Closures一樣,只是前面加了一串@escaping
,我們引用官方的範例簡單解釋一下
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completion: @escaping () -> Void) {
completionHandlers.append(completion)
}
因為在funciton結束之後completion
閉包還會被function之外的completionHandlers
使用,所以需要使用逃逸閉包調出function之外使用。這部分可能之後教到API的部分你們會比較好理解。