iOS _ 閉包 ( Closures )
Closures 的學習筆記
所以 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。
簡單來說,就是Closure內只有一行程式,則可以不寫『return』。
另一個簡寫方式是把 Closure 參數的名稱變成預設代號,第一個參數為 $0,第二個參數為 $1,依此類推。因為透過 $ 存取參數,所以原先宣告參數也沒有存在的必要,因此這樣的寫法就也可以省略 in。 ( 用預設代號這個方式在很多可以看到 )
如果想在 function 外繼續使用傳入 Closure 內的參數,那就需要 Closure 的參數上加上 @escape,因為當 Closure 作為參數傳入 function 時,則這個 Closure 的生命週期因該在該function 返回時也跟著結束,所以必須需要加上 @escape,讓 Closure 傳入的參數能在 function 返回後,一樣能執行。
如果 Closure 的參數上加上 @escape,那在存取⾃己的屬性要加上self。
留言
張貼留言