클로저 - 캡쳐
캡쳐:
클로저가 자신이 정의된 환경에서 변수나 상수를 기억하고, 나중에 사용할 수 있도록 하는 방법
클로저가 만들어진 시점의 주변 환경을 기억하고 사용할 수 있게 함
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:
[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