iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Mobile Development

如何成為IOS初級工程師系列 第 7

Day-07 閉包到底是在包什麼? - closures

  • 分享至 

  • xImage
  •  

現在開始會越來越複雜,但我會想辦法用非常簡單的方式解釋原理讓你理解。

進入正題

今天會學到

  • 閉包表達式
  • 尾隨閉包 (Trailing Closures)
  • 逃逸閉包(escaping Closures)

先講一下通常哪裡可以用到閉包

  • 通常我們建立UI元件時,也會用到閉包
  • 假設我們想要呼叫API然後把資料顯示在畫面上,通常呼叫API時會寫一個function,但是呼叫API需要時間回傳資料(會使用非同步的方式呼叫),我們要等回傳資料後馬上把資料顯示到畫面上,這時候閉包就很好用。

但現在你可能不懂API,UI元件等等,不緊張我後面的章節會介紹,沒關係我們先了解一下概念,以後多寫程式就會慢慢理解了。

Closures

閉包簡單來說就是沒有名稱的函式(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")
}

尾隨閉包 (Trailing Closures)

尾隨閉包是當閉包當作function的參數時,呼叫function時可以簡化變成閉包表達式並且放在呼叫的function後面。

func test(name: String, closure: () -> Void) {  //假設我們先設計一個函式,並且使用閉包當作參數
    程式碼
}

test(name: "Roger", closure: {   // 呼叫函式一般的寫法
    // closure程式碼
})

test(name: "Roger") {    // 呼叫函式時使用trailing closures
    // closure程式碼
}

簡單來說就是簡化而已。

逃逸閉包(escaping Closures)

如果想要在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的部分你們會比較好理解。


上一篇
Day-06 - 組團囉,到底是有還是沒有 - Enum, Optional
下一篇
Day-08 展現特質的屬性 - Properties
系列文
如何成為IOS初級工程師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言