GGURUPiOS

[Swift] Escaping Closure(탈출 클로저)란? 본문

카테고리 없음

[Swift] Escaping Closure(탈출 클로저)란?

꾸럽 2023. 12. 5. 16:25

안녕하세요

이번시간에는 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

 

클로저 (Closures) - Swift

다음은 Int 값의 배열을 String 값의 배열로 변환하기 위해 후행 클로저와 map(_:) 메서드를 어떻게 사용하는지 나타냅니다. 배열 [16, 58, 510] 은 새로운 배열 ["OneSix", "FiveEight", "FiveOneZero"] 을 생성하는

bbiguduk.gitbook.io