[Swift] 클로저

E_H·2021년 9월 23일
0

Swift

목록 보기
10/11

클로저란?

클로저란 이름이 없는 함수(익명함수)로,
함수보다 더 큰 범주에 속하며 형태만 다릅니다.

또한 프로토콜과 함께 1급 객체로 사용할 수 있습니다.

클로저의 형태로는 두 가지가 있습니다.

  • Unnamed Closure
  • Named Closure

Named Closure

func namedClosure() {}

일반적인 함수의 형태가 named closure라고 할 수 있습니다.

Unnamed Closure

let unNamedClosure = { print("TestNumber") }

변수에 할당된 형태로 함수의 이름이 없어 Unnamed Closure라고 합니다.

일반적으로 불리는 클로저는 이 UnNamed의 형태입니다.

클로저 표현

기본적인 클로저 표현으로는 파라미터와 return type이
closure의 헤더 부분이고 in 키워드 아래 statements는 클로저의 바디 부분이라고 부릅니다.

let personName = { (name: String) -> String in
    return name
}

personName("kim") // kim

personName 변수는 (String) -> String 타입으로

파라미터로 String값을 받으면 그 값을 String으로 리턴하여
"kim"을 반환합니다.

이것이 기본적인 클로저 표현식입니다.

클로저의 축약

이런 클로저는 간단하게 표현할 수 있는데

Trailling Closure(후행 클로저)

함수의 마지막 파라미터가 클로저 형태일때 Argument Label을 생략할 수 있습니다.

func someFunctionThatTakesAClosure(closure: () -> Void) {
    // function body goes here
}

someFunctionThatTakesAClosure(closure: {
    // closure's body goes here
})

someFunctionThatTakesAClosure() {
    // trailing closure's body goes here
}

someFunctionThatTakesAClosure {
    // trailing closure's body goes here
}

파라미터 생략

func numNumber(closure: (Int, Int, Int) -> Int) {
    closure(1, 2, 3)
}


numNumber(closure: { (a: Int, b: Int, c: Int) -> Int in
    return a + b + c
})

리턴타입 생략 가능

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

Parameter Name은 Shortand Argument Names으로 대체하며,
이 경우 Parameter Name과 in 키워드를 삭제

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

단일 리턴문을 사용할 경우 return 또한 축약 가능.

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

클로저가 마지막 파라미터면 후행 클로저 가능.

doSomething {  
    $0 + $1 + $2
})

참고자료

https://babbab2.tistory.com/81

https://docs.swift.org/swift-book/LanguageGuide/Closures.html

0개의 댓글