Closures

Swift 中,可以定義一個 variable (變數) 為 function,例如:

let greetingPrinter = {
   println("Hello World!")
}

更進一步,我們定義 greetingPrinter 的 type(型態):

let greetingPrinter: () -> () = {
   println("Hello World!")
}

//  以上式子其實就等於以下的宣告:
//    func greetingPrinter() -> () = {
//        println("Hello World!")
//    }
//

其中 () -> () 表示: greetingPrinter 為一個 function,參數為 void (第一個()),回傳值也是 void (第二個())。


直接呼叫變數,就可以執行 function,例如:

let greetingPrinter: () -> () = {
   println("Hello World!")
}

greetingPrinter()

輸出結果為:

Hello World!

Closures as Parameters

Swift 中,function 可以當成 另一個 function 的參數,例如:

func repeat(count: Int, task: () -> ()) {
   for i in 0..count {
       task()
   }
}

repeat(2, {
       println("Hello!")
})

輸出結果為:

Hello!
Hello!

Trailing Closures

此外,如果你把 function 當做「另一個 function 的 最後一個 參數」,那可以使用 Trailing Closures 的語法,讓程式碼看起來更清爽!

例如上一個範例中:

func repeat(count: Int, task: () -> ()) {
   for i in 0..count {
       task()
   }
}

repeat(2, {
       println("Hello!")
})

可以把 repeat 改寫成:(因為{println("Hello!")}是最後一個參數)

repeat(2) {
       println("Hello!")
}

輸出結果為:

Hello!
Hello!

下一篇: Classes