[swift] 주변 변수를 캡처하는 클로저

클로저는 Swift에서 강력한 기능 중 하나입니다. 클로저는 코드 블록을 나타내며, 변수와 함수를 캡처하여 사용할 수 있습니다. 이번 글에서는 주변 변수를 캡처하는 클로저에 대해 알아보겠습니다.

클로저 기본

먼저 클로저의 기본적인 사용법을 알아보겠습니다. 클로저는 {}로 감싸집니다. 클로저 내부에서 주변 변수를 캡처하려면 in 키워드를 사용해주어야 합니다. 예시 코드를 살펴보겠습니다.

func makeIncrementer(incrementAmount: Int) -> () -> Int {
    var total = 0
    let incrementer: () -> Int = {
        total += incrementAmount
        return total
    }
    return incrementer
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo()) // 2
print(incrementByTwo()) // 4

위의 코드에서 makeIncrementer 함수는 incrementAmount 값을 받아 total 변수와 클로저를 생성한 뒤 클로저를 반환합니다. 클로저는 total 변수를 캡처하고 있으며, 호출 될 때마다 total 값을 증가시키고 반환합니다.

값 캡처와 참조 캡처

클로저는 주변 변수를 캡처할 때, 값 타입인지 참조 타입인지에 따라 다르게 동작합니다.

func makeIncrementer(incrementAmount: Int) -> () -> Int {
    var total = 0
    let incrementer: () -> Int = { [total] in
        total += incrementAmount
        return total
    }
    return incrementer
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo()) // 2
print(incrementByTwo()) // 2 (total 값은 변경되지 않음)
func makeIncrementer(incrementAmount: inout Int) -> () -> Int {
    var total = 0
    let incrementer: () -> Int = { [total] in
        total += incrementAmount
        return total
    }
    return incrementer
}
var amount = 2
let incrementByTwo = makeIncrementer(incrementAmount: &amount)
print(incrementByTwo()) // 2
print(incrementByTwo()) // 4 (amount 값이 변경되어 total 증가)

정리

클로저는 Swift에서 매우 유용한 기능이며, 주변 변수를 캡처하여 사용할 수 있습니다. 값 캡처와 참조 캡처를 이용하여 클로저의 동작을 제어할 수 있습니다. 클로저를 사용하여 코드를 단순화하고 효율적으로 구현할 수 있으니, 적절한 상황에서 활용해보세요.


참고: