iOS Closure with capture list
운영 체제: macOS Ventura 13.0.1
사용 버전: Xcode 14.1, Swift
아래와 같은 코드가 있습니다.
처음에 2와 4를 넣고 클로저를 만든 다음, 후에 17 번째 줄에서 wheel을 6으로 바꾸자 클로저 안의 내용까지 변경되었습니다.
사용 버전: Xcode 14.1, Swift
iOS Closure with capture list를 알아보겠습니다.
Closure를 사용할 때, capture list를 사용하면 ARC(Auto Reference Counting)에서 카운팅 하지 않고 참조를 하게 됩니다. 그리고 외부의 값이 클로저 내부를 변화시키지 않게 만듭니다.
아래와 같은 코드가 있습니다.
처음에 2와 4를 넣고 클로저를 만든 다음, 후에 17 번째 줄에서 wheel을 6으로 바꾸자 클로저 안의 내용까지 변경되었습니다.
클로저 내부 변수를 계속 참조하기 때문인데요. 이것을 capture list로 사용하면
클로저가 생성된 당시의 값을 보유하게 됩니다.
14 번째 줄처럼 [] 대괄호와 함께 캡처할 값을 넣습니다. 그러면 밖에 값이
아무리 변해도 생성 당시의 door와 wheel의 값을 가집니다.
클로저 내부 변수를 다른 이름으로 사용하려면 다음과 같이 사용합니다.
class를 위한 capture list가 존재합니다. weak와 unowned입니다.
아래 코드를 봅시다.
11 번째 줄에서 car이 생성되고 13 번째 줄에서 car이 사용됩니다. 그래서 내부
변수인 car은 setUp이 끝날 때 사라지는 것이 아니라 closure 때문에 해제되지
않습니다.
여기서 closure 상관없이 해제시킬 수 있도록 만든 게 weak capture list입니다.
13 번째 줄처럼 weak를 붙여줍니다. weak는 nil 일 수 있기 때문에 guard를
추가해 줍니다.
실행하면 closure에서 호출하지만, setUp이 끝남과 동시에 car이 사라져서 nil이
됩니다.
unowned capture list는 참조하는 값이 nil이 아니라는 확신이 있을 때
사용합니다.
지금처럼 nil이 되는 순간에는 오류가 발생합니다.
카테고리: iOS
댓글
댓글 쓰기
궁금한 점은 댓글 달아주세요.
Comment if you have any questions.