📚 탈출 클로저 Escaping Closure
스위프트에서는 함수의 파라미터로 전달된 클로저는 기본적으로 해당 함수 내부에서만 사용이 가능합니다
-> 이걸 탈출 불가 상태라고 하죠.
원래 클로저는 참조 타입이며 변수, 상수 등으로 저장, 전달 인자로 저장이 가능한 형태이지만
파라미터로 받은 클로저는 직접 실행만 가능하고, 외부 변수나 상수에 대입이 불가능한 형태입니다.
클로저가 파라미터로 넘어가게 되면 해당 함수가 끝나서 리턴되기 전에 클로저가 실행이 됩니다.
그리고 해당 함수가 실행 완료되면 클로저의 사용이 불가능하게 됩니다.
하나의 예시를 살펴볼까요?
class ViewController: UIViewController {
var sampleClosure : () -> Void = {}
override func viewDidLoad() {
super.viewDidLoad()
callback {
print("Closure가 실행되었습니다.")
}
}
func callback(closure: () -> Void) {
sampleClosure = closure // @escaping 없으면 에러
sampleClosure()
}
}
클래스에 sampleClosure라는 변수를 선언하고 해당 callback 함수 내부에서
매개변수로 받은 closure를 대입하려고 하면 에러가 발생합니다.
그런데 클로저 앞에 [ @escaping ] 키워드를 달아주면 오류가 사라지게 됩니다.
class ViewController: UIViewController {
var sampleClosure : () -> Void = {}
override func viewDidLoad() {
super.viewDidLoad()
callback {
print("Closure가 실행되었습니다.")
}
}
func callback(closure: @escaping () -> Void) {
sampleClosure = closure
sampleClosure()
}
}
이 상태에서 이걸 가능하게 해주는,,
그러니까 함수가 실행 후에도 해당 클로저의 실행이 가능하게 해주는 것이
바로 Escaping Closure 입니다.
= 탈출 클로저
즉, 클로저를 탈출하게 만들어 준다.
탈출 클로저로 만들어 주면
1. 해당 클로저를 외부 변수/상수에 저장이 가능하고
2. 해당 함수가 실행이 끝나도 클로저 실행이 가능합니다.
-> 즉, 탈출 클로저를 통해서 함수의 실행 순서를 정할 수 있습니다.
그리고 [ 탈출 ] 을 했기 때문에 이제는 [ 외부 ] 에서도 사용이 가능하게 된 거죠.
자,, 그렇다면 탈출 클로저를 왜? 언제? 사용하냐??
네! 통신할 때 아주 중요하게 사용됩니다.
우리는 서버와의 통신을 할 때 비동기 방식으로 코드를 처리해줍니다.
= 그러니까 코드의 실행 완료를 기다리지 않고 진행함과 동시에 다음 라인으로 넘어간다는 거죠.
-> 탈출 클로저를 사용하지 않는다면 여기서 문제가 발생하죠
예를 들어, 비동기 방식으로 서버에서 이미지를 받아오는 코드가 있다고 치면
이미지를 받아오기도 전에 return result 코드가 실행되면 빈 이미지가 return이 됩니다.
그럼 안되겠죠?
그래서 우리가 탈출 클로저를 써주는 것입니다.
서버에서 이미지를 다 가져오지 못한 상태로 함수가 return 되더라도
후에 서버 작업이 완료되면 탈출 클로저를 호출할 수 있기 때문에 데이터를 안전하게 전달받는 것이 보장됩니다.
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] NSMutableAttributedString : 문자열 특정 부분 색 바꿔주고 싶을 때 (0) | 2021.06.07 |
---|---|
[iOS] Then / DuctTape 라이브러리 사용기 (0) | 2021.06.07 |
[iOS] Alamofire를 통해 서버와 통신 해보기 - GET (4) | 2021.05.14 |
[Swift] 싱글턴 패턴 : Singleton Pattern이란? (0) | 2021.05.14 |
[iOS] 데이터 직접 전달 방식(3) - Delegation을 통해 전달 (1) | 2021.04.30 |