iOS _ 閉包 ( Closures )

Closures 的學習筆記


Closures 和 Function 的功能很相似,而從 Closures 就像似一個沒有名稱的 Function,
所以 Closures 可以定義一段程式碼,也可以接受參數和回傳資料。

然而以下是兩者之間的差異!

首先在 Apple Closures的語法是
{ ( parameters ) -> ( return type)  in
  ( statements )
}

從兩者的格式來看就能更清楚,
Function
func 方法名(參數一,餐數二) -> 回傳值 {
   程式碼區域
 }

Closures
{ (參數一, 參數二) -> 回傳值 in
 程式碼區域
}

從這兩個格式來看, Function 把前面的方法名稱拿掉,
然後把參數和回傳型別拿到大括弧內

但 Closures 沒辦法像 Function 可以單獨定義,
因此必須指派為 變數 或是 常數 或 當作參數傳入 Function

( 將 Closures 指派為常數 )







( 將 Closures 指派當做參數傳入 Function ,而這個也是最常看到的用法)







通常如果沒有重覆需要呼叫需求時 就 closures 來處理,
在執行方法後要立即執行其他事情時使用,
( 例如 網路下載資料後,去更新呈現的畫面內容 )

以上是基本的 Closures 的 基本寫法。

接下來是 Closures 的簡寫,這個也是常常每個不同專案較長看到的。

當 Closures 是 Function 的最後一個參數的時候,
可以移除 Function 中 Closures 的『 參數 』和『 冒號 』,
然後最後的『 小括號移到前面

如同上面的是 簡寫 過的方式
birthday(month: 3, day: 1 ) { ( ) -> String in
   return " Happy Birthday "
}

原版本是
birthday(month: 3, day: 1 , say:  { ( ) -> String in
   return " Happy Birthday "
)

而當參數只有一個 Closures 時候,
就等於 Trailing Closures(尾隨閉包)

func birthday( program: ( ) -> String ){
print("說\( program() ) ")
 }

birthday { ( ) -> String in
   return " Happy Birthday "

Implicit Returns from Single-Expression Closures
簡單來說,就是Closure內只有一行程式,則可以不寫return』


另一個簡寫方式是把 Closure 參數的名稱變成預設代號,第一個參數為 $0,第二個參數為 $1,依此類推。因為透過 $ 存取參數,所以原先宣告參數也沒有存在的必要,因此這樣的寫法就也可以省略 in。 ( 用預設代號這個方式在很多可以看到 )





如果想在 function 外繼續使用傳入 Closure 內的參數,那就需要 Closure 的參數上加上 @escape因為當 Closure 作為參數傳入 function 時,則這個 Closure 的生命週期因該在該function 返回時也跟著結束,所以必須需要加上 @escape,讓 Closure 傳入的參數能在 function 返回後,一樣能執行

如果 Closure 的參數上加上 @escape,那在存取⾃己的屬性要加上self。

留言

這個網誌中的熱門文章

IOS_Objective-C學習筆記_(陣列 / 可修改陣列 ;字典 / 可修改字典)..

20170122 Radiobutton功能練習 (溫度轉換)

iOS_開發 拿到 Tableview Cell 上的按鈕是哪一個 (Tableview Cell Button)