[swift] 클로저 캡처 리스트

클로저는 주변에 있는 변수나 상수를 캡처하여 사용할 수 있습니다. 클로저에서 캡처하는 변수나 상수를 명시적으로 관리하기 위해 캡처 리스트(capture list) 를 사용할 수 있습니다.

캡처 리스트는 클로저의 인자 목록과 {} 중괄호 사이에 위치하며, [ ] 대괄호를 통해 표현됩니다. 캡처 리스트는 쉼표로 구분된 캡처할 변수나 상수의 목록으로 이루어집니다.

캡처 리스트 사용 예시

다음은 캡처 리스트를 사용하여 클로저에서 self를 약한 참조로 캡처하는 예시입니다.

class SomeClass {
    var name = "Swift"

    lazy var closure: () -> String = { [weak self] in
        guard let self = self else { return "No name" }
        return "Hello, \(self.name)"
    }

    deinit {
        print("SomeClass 인스턴스가 해제됨")
    }
}

var instance: SomeClass? = SomeClass()
print(instance?.closure() ?? "인스턴스 없음") // 출력: Hello, Swift
instance = nil  // SomeClass 인스턴스가 해제됨

위 예시에서 closure 프로퍼티에 할당되는 클로저에서 self를 약한 참조로 캡처하기 위해 캡처 리스트를 사용했습니다. 이를 통해 클로저 내에서 self에 대한 약한 참조를 명시하고, selfnil이 될 경우 “No name”을 반환하도록 구현하여 메모리 누수를 방지할 수 있습니다.

캡처 리스트를 사용하여 클로저가 캡처하는 변수나 상수를 명확하게 관리함으로써 메모리 관리와 클로저의 동작에 대한 가독성을 향상시킬 수 있습니다.

더 많은 정보는 Swift 공식 문서를 참고하세요.