Swift

클로저 - 캡쳐

JDeoks 2023. 10. 17. 00:40

캡쳐:

클로저가 자신이 정의된 환경에서 변수나 상수를 기억하고, 나중에 사용할 수 있도록 하는 방법

클로저가 만들어진 시점의 주변 환경을 기억하고 사용할 수 있게 함

func makeIncrementer(step: Int) -> () -> Int {
    var total = 0
    let incrementer: () -> Int = {
        total += step
        return total
    }
    return incrementer
}

let incrementByTwo = makeIncrementer(step: 2)
let first = incrementByTwo() // first = 2
let second = incrementByTwo() // second = 4

makeIncrementer(step: int)는 step이라는 Int를 받고 () -> Int 형 클로저 를 반환한다.

원래의 함수에서 생성한 변수라면 스코프가 함수 내부로 제한되어 있으므로 함수의 실행이 끝날 때 함께 소멸해야 한다.

하지만, 위 코드에서 incrementer 클로저는 step, total을 캡쳐한다.

incrementer가 두 변수를 캡쳐함으로써 두 변수의 reference count가 1씩 증가하는데, 

이것이 두 변수가 스코프를 벗어났는데도 incrementer가 계속 사용할 수 있는 이유이다.

incrementByTwo 에 nil을 대입해서 클로저의 참조 카운트를 0으로 만들면, step과 total도 소멸한다.

 

Capture List:

https://velog.io/@kipsong/Swift%EB%AC%B8%EB%B2%95-Closure-Capture%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

[Swift][문법] Closure Capture에 대하여

클로저에서 공부해야할 개념들이 여러가지가 있습니다만, 그 중에서 좀 까다로울 수 있는 "Capture Values" 부분을 작성하겠습니다.직역하자면, "값을 잡아둔다" 정도로 해석이 되겠죠.네, 맞습니다.

velog.io

weak self:

https://bongcando.tistory.com/20

 

[Swift] 클로저에서의 weak self 에 대해 알아보자

클로저를 사용하면서 weak self를 사용해본 경험이 있거나, weak self를 사용하는 코드를 본 적이 있을 것이다. weak self 를 왜 사용해야 하고, 언제 사용해야 하는지에 대해 알아보자. 1. weak self를 왜

bongcando.tistory.com