[Swift]エンクロージャ(Closers)


エンクロージャ


コードに転送および使用可能な独立した機能ブロックで、一級オブジェクトとして使用できます.

一級オブジェクト?


伝達パラメータとして送信してもよいし、変数/定数を格納または伝達してもよいし、関数の戻り値としてもよい.

コードの例

import UIKit

/*
 { (parameters) -> return type in
     statements
 }
 */

let hello = { () -> () in
    print("hello")
}

hello()

let hello2 = { (name: String) -> String in
    return "Hello, \(name)"
}

//hello2(name: "Daeseong") // Error : 전달인자 레이블을 적으면 오류 발생

hello2("Daeseong") // "Hello, Daeseong"

func doSomething(closure: () -> ()) {
    closure()
}

doSomething(closure : { () -> () in
    print("hello")
}) // "hello"

func doSomething2() -> () -> () {
    return { () -> () in
        print("hello!")
    }
}

doSomething2()() // hello!


// Closure의 축약
func doSomething3(closure: (Int, Int, Int) -> Int) {
    closure(1,2,3)
}

doSomething3(closure: {(a,b,c) in
    return a+b+c
})

doSomething3(closure : {
    return $0+$1+$2
})

doSomething3(closure : {
    return $0+$1+$2
})

doSomething3(closure : {
    $0+$1+$2
})

doSomething3(){
    $0+$1+$2
}

doSomething3 {
    $0+$1+$2
}