스위프트 문법 15 (Closure)

스위프트 문법 15 (Closure)

- 3 mins

Closure

function - named code block
closure - unnamed code block (lambdas, 익명 함수)

Basic Closure

let simpleClosure = {
    print("This is SimpleClosure!!")
}
simpleClosure()
//This is SimpleClosure!!

위의 Closure는 () -> () 타입이다.
파라미터를 넣을 수 도 있다.

let closureParameter = { (str: String) -> Int in        //in은 그냥 구분하는 역할
    return str.count
}

closureParameter("Swift") //클로져에서는 파라미터 이름을 입력하지 않아도 된다.

위의 Closure은 (String) -> Int타입이다.

또, 함수를 일반 변수에 넣어서 저장할 경우에도 Closure가 된다.

func voidFunction() {
    print("1")
}

let var1 = voidFunction

또, 직접적으로 파라미터와 리턴을 명시해줄 수 있다.

let var2: ()->() = {
    print("1")
}
//아래와 완전 동일
let var3 = { ()->() in
    print("1")
}

Inline closure

func printSwift() {
    print("Swift")
}
let arg = {
    print("Inline Closure!!")
}

func closureParamFunction(closure: () -> Void) {    //파라미터이름을 closure라고 지정
    closure()
}

closureParamFunction(closure: arg)
closureParamFunction(closure: printSwift)
closureParamFunction(closure: {
    print("explicit closure parameter name")
})

Trailing Closure

클로져의 마지막 인자는 인자 이름을 입력하지 않아도 사용할 수 있다.

closureParamFunction() {
  print("Trailing")
}

closureParamFunction {
  print("Trailing")
}

func closureParamFunction2(closure1: () -> Void, closure2: () -> Void) {
  closure1()
  closure2()
}

closureParamFunction2(closure1: {
  print("inline")
}, closure2: {
  print("inline")
})

closureParamFunction2(closure1: {
  print("inline")
}) {  //여기에 인자명도 사용하지 않고 사용할 수 있다.
  print("trailing")
}

Syntax Optimization

//어떻게 실행되는지 모름
func performClosure(param: (String) -> Int) {
    print(param("Swift"))
}

//어떤 값이 들어오는지 모름
performClosure(param: { (str: String) -> Int in
    return str.count
})

위의 코드를 아래와 같이 줄여나갈 수 있다.

performClosure(param: { (str: String) in
  return str.count
})

performClosure(param: { str in
  return str.count
})

performClosure(param: {
  return $0.count
})

performClosure(param: {
  $0.count
})

performClosure(param: ) {
  $0.count
}

performClosure() {
  $0.count
}

performClosure { $0.count }
comments powered by Disqus
rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora