[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
에 대한 약한 참조를 명시하고, self
가 nil
이 될 경우 “No name”을 반환하도록 구현하여 메모리 누수를 방지할 수 있습니다.
캡처 리스트를 사용하여 클로저가 캡처하는 변수나 상수를 명확하게 관리함으로써 메모리 관리와 클로저의 동작에 대한 가독성을 향상시킬 수 있습니다.
더 많은 정보는 Swift 공식 문서를 참고하세요.