iOS Closure with capture list

운영 체제: macOS Ventura 13.0.1
사용 버전: 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

댓글

이 블로그의 인기 게시물

Python OpenCV 빈 화면 만들기

Python urllib.parse.quote()

Python bytes.fromhex()

Android AVD Ram size change

Forensics .pyc 파일 .py로 복구하기

Android Minimum touch target size

KiCad 시작하기 7 (FreeRoute 사용하기 2)

Android Notification with Full Screen

C++ OpenCV 모폴로지 침식, 팽창

KiCad 시작하기 2 (PCB 만들기)