Alex Liang

Swift Closure 介紹

Closure在Swift有二層意思。第一種是一般認知的global或nested functions,函式中擁有free variable可被nested function存取;或作為變數傳給另一個function

第二種為closure expression,在function的定義後加上簡短表示式。在Swift中,closure通常是指closure expression

Functions Parameters

1
2
3
4
5
6
7
8
9
func printString(str: String) {
print(str)
}

func displayName(printFunc: String -> Void) {
printFunc("Alex Gordon")
}

displayName(printString) // Print "Alex Gordon"

Swift可以將function當參數傳入另一個function

Capturing Values

1
2
3
4
5
6
7
8
9
10
11
func doSomething(y: Int) -> () -> Int {
var x = 10
func f() -> Int {
x += y
return x
}
return f
}

let f = doSomething(19)
var result = f() // result = 29

function f可以捕捉到x的值並且做運算,x在這裡為free variable,這種nested function能帶來很大的彈性

Closure Expressions

1
[1,2,3].map( {(i: Int) -> Int in return i * 2} ) 	// [2, 4, 6]

Swift的array內建許多高階函式,map能將陣列的值做轉換並回傳新陣列
上例中,map裡{}包起來的表示式為closure expression
i當做參數並寫明回傳型態為Int,in return接上陣列轉換的算式
此為完整closure expression的宣告方式

而Swift提供許多syntax sugar,

1
2
3
4
5
[1,2,3].map( {i in return i * 2} )
[1,2,3].map( {i in i * 2} )
[1,2,3].map( {$0 * 2} )
[1,2,3].map() {$0 * 2}
[1,2,3].map {$0 * 2}

以上的表示式功能都一樣,把陣列元素*2後回傳

Trailing Closures

一般的function要加上closure exprssion當參數有二種做法

1
2
3
4
5
6
7
8
9
10
11
func someFunc(closure: () -> Int) {
// function body
}

someFunc({ // 做法1
// closure body
})

someFunc() { // 做法2
// trailing closure body
}

第二種做法將closure expression寫在function之後,增加可讀性

Closure在現代程式設計被廣泛使用,這也是functional programming的基石

參考來源:
A Basic Tutorial on Functions and Closures in Swift
An Accumulator in Swift
Higher Order Functions: Map, Filter, Reduce and more
官方文件