Post

Swift 클로저란

Swift 클로저란

Swift 클로저(Closure) 핵심 정리 – 함수도 값이다

Swift에서 클로저는 **일급 시민(First-Class Citizen)**이다. 즉, 함수 자체가 변수에 저장되고, 다른 함수에 인자로 넘기거나 반환값으로 사용할 수 있다는 뜻이다.

함수형 프로그래밍이 가능한 Swift에서 클로저는 자주 쓰이며, UIKit/SwiftUI에서 콜백, 이벤트 핸들링, 고차 함수(map, filter, reduce) 등에 폭넓게 사용된다.


클로저란?

  • 이름 없는 함수 혹은 익명 함수
  • 함수와 동일하게 매개변수, 반환값, 실행 코드 블럭을 포함
  • 함수처럼 실행 가능하지만, 값으로 전달하거나 저장할 수 있음
1
2
3
{ (매개변수) -> 반환형 in
    실행 코드
}

1. 클로저 기본 형태

① 매개변수 X, 반환 X

1
2
3
4
let closure: () -> Void = {
    print("Hello, Closure")
}
closure()

② 매개변수 O, 반환 X

- 전체 형태

1
2
3
4
let closure: (_ name: String) -> Void = { (name: String) in
    print(name)
}
closure("차상진")

- 생략형

1
2
3
let closure: (String) -> Void = { name in
    print(name)
}

- 축약형 (매개변수 1개일 때)

1
2
3
let closure: (String) -> Void = {
    print($0)
}

- 매개변수 무시

1
2
3
let closure: (String) -> Void = { _ in
    // 매개변수 안 씀
}

③ 매개변수 O, 반환 O

1
2
3
4
5
let closure: (String) -> String = { name in
    return name + "입니다."
}

let result = closure("차상진") // "차상진입니다."

2. 클로저 사용 예

클래스 내부에서 클로저 프로퍼티 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Sample {
    var sampleFunc: () -> Void

    init() {
        sampleFunc = {} // 초기값
    }

    func test() {
        sampleFunc()
    }
}

class MainViewController {
    let sample = Sample()

    func clickBtn() {
        sample.sampleFunc = {
            print("click btn")
        }
    }
}

let mainVC = MainViewController()
mainVC.clickBtn()
mainVC.sample.test() // "click btn"
  • 위처럼 설정(할당) 후 실행하는 패턴은 Swift에서 자주 쓰인다.

3. 고차 함수에서의 클로저

① 매개변수가 클로저인 경우

1
2
3
4
5
6
7
let execute: ((Int) -> Void) -> Void = { closure in
    closure(5)
}

execute { value in
    print(value * 2) // 10
}

② 반환값이 클로저인 경우

1
2
3
4
5
6
7
8
let factory: () -> (() -> String) = {
    return {
        return "sangjin"
    }
}

let result = factory()
print(result()) // "sangjin"

③ 매개변수와 반환이 모두 클로저인 경우

1
2
3
4
5
6
7
8
9
10
11
let composed: (() -> Int) -> (() -> String) = { closure in
    return {
        return String(closure())
    }
}

let result = composed {
    return 42
}

print(result()) // "42"

마무리

Swift에서 클로저는 단순한 익명 함수 이상의 존재다. 이벤트 핸들링, 네트워크 콜백, 커스텀 알림 등 다양한 영역에서 쓰이며, Swift 개발자가 반드시 이해해야 할 핵심 개념이다.

함수 = 값 → 변수에 저장 가능 → 함수 안에 전달 → 함수에서 반환 이 개념을 이해하면 클로저가 어렵지 않다.

This post is licensed under CC BY 4.0 by the author.