GGURUPiOS
[Swift] Escaping Closure(탈출 클로저)란? 본문
안녕하세요
이번시간에는 Escaping closure (탈출 클로저)에 대해 알아보겠습니다.
Escaping Closures?
함수에 인자로 클로저를 전달, 함수가 반환된 후 호출되는 클로저를 함수를 탈출하다 라고 말할 수 있음
아래와 같이 작성할 수 있습니다.
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
Non-Escaping Closures
일반적인 클로저(escaping closure가 아닌 클로저)는 아래와 같은 특징을 가집니다
- 클로저는 전달된 함수가 반환되기 전에 실행되도록 보장함
- 컴파일러는 클로저가 함수 외부에서 사용되지 않을 것임을 알고 그에 따라 코드를 최적화
- Swift의 기본 클로저 타입임
Escaping Closures
- 탈출 클로저는 함수에 대한 인수로 전달되지만 함수가 반환된 후에 호출 됨
- 클로저는 호출될 때까지 메모리에 저장하며, 이는 클로저를 생성한 함수보다 오래 지속될 수 있음을 의미 (escape)
왜 Escaping Closures를 사용할까?
그렇다면 Escaping Closures 는 언제 사용할까요?
escape 할 수 있기에, 함수가 끝난 뒤에 실행되어야 할 때 사용하면 좋겠죠? 예를 들어, 네트워킹 로직을 생각해보면
네트워킹은 비동기적으로 이루어지기 때문에 함수가 끝나는(return) 시점과, 비동기 네트워킹 작업이 끝나는 시점이 다릅니다.
네트워킹 작업이 끝났을 때 어떤 특정 작업을 해야한다면 네트워킹이 끝난 뒤에 호출해야 합니다.
이런식으로 Escaping Closures는 대부분의 비동기 작업에서 유용합니다.
아래에는 그 예시들 입니다.
- 네트워크 요청: 서버에서 응답을 받으면 실행 되는 작업
- 비동기 API: iOS및 macOS의 많은 API들이 비동기식이기 때문에, 응답 또는 작업 완료 후에 이루어 지는 작업
- 커스텀 애니메이션: 앱에서 특정 애니메이션이 완료 됐을 때, 추가 작업 수행 또는 인터페이스 업데이트
- 위임(Delegation): 위임객체를 만드는 대신 이벤트 처리 클로저를 이벤트를 트리거하는 함수에 전달
출처
https://bbiguduk.gitbook.io/swift/language-guide-1/closures#escaping-closures