Swift & iOS

[Swift] 클로저 (Closure)

hammii 2022. 6. 22. 15:04
728x90
반응형

클로저란?

  • 코드에서 전달 및 사용할 수 있는 독립 기능 블록이며, 일급 객체의 역할을 할 수 있다.
  • 참조 타입
  • 이름 없는 함수, 익명 함수로 지칭한다.
  • 즉, 클로저는 Named Closure, Unnamed Closure 모두 포함하지만, 보통 Unnamed Closure를 말한다.
    • 함수는 클로저의 한 형태로, Named Closure(이름이 있는 클로저)이다.

일급 객체가 궁금하다면 아래 더보기 클릭 !

더보기

일급 객체: 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수도 있다.

 

클로저 문법 (head & body)

 { (매개 변수) -> 리턴 타입 in
    실행 구문
 }

클로저에서는 전달 인자 레이블을 사용하지 않는다.

 

 

클로저 예시

1. 파라미터와 리턴 타입이 없는 클로저

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

2. 파라미터와 리턴 타입이 있는 클로저

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

3. 파라미터로 클로저를 사용하는 경우

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

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

doSomething() { // 파라미터와 반환값이 없는 클로저는 이렇게 생략 가능
    print("hello2")
}

doSomething {   // 단 하나의 클로저만 매개변수로 전달하는 경우 소괄호 생략 가능
    print("hello2")
}

4. 반환 타입으로 클로저를 사용하는 경우

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

 

후행 클로저

클로저가 조금 길어지거나 가독성이 떨어지면 후행 클로저 기능을 사용하면 된다.

 

후행 클로저란?

  • 클로저가 함수의 마지막 argument라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있게 해주는 것
//후행 클로저 미사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default, handler: {
    // 실행 코드
})

//후행 클로저 사용
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default) {
    // 실행 코드
})

매개변수에 클로저가 여러 개인 경우, 아래와 같이 다중 후행 클로저 문법을 사용할 수 있다.

func doSomething2(success: () -> (), fail: () -> ()) {
    
}

doSomething2 {
    <#code#>
} fail: {
    <#code#>
}

 

클로저 표현을 간소화하는 방법

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: {
    $0+$1+$2 // 단일 리턴문일 경우, return 생략 가능 
})
doSomething3() {
    $0+$1+$2
}
doSomething3 {
    $0+$1+$2
}

 

 

출처: [패스트캠퍼스] 30개 프로젝트로 배우는 iOS 앱 개발 with Swift 초격차 패키지 Online.

 

728x90
반응형