-
Closure 심화Swift 2021. 4. 27. 18:11
안녕하세요. 그린입니다🟢
이번 포스팅에서는 클로저의 심화편으로 Completion Handler / Escaping Closure / Auto Closure에 대해 알아보겠습니다.
Completion Handler
- 어떤 상황에서 일이 끝났을때 진행할 업무를 담당
- 컴플리션 핸들러에 클로저를 적용시켜볼 수 있음
Completion Handler에서의 클로저 축약 과정
1. VC.present(secondVC, animated: true, completion: { () in print(“화면 이동”) })
2. VC.present(secondVC, animated: true, completion: { print(“화면 이동”) })
3. VC.present(secondVC, animated: true) { print(“화면 이동”) }
Escaping Closer
- @escaping이라는 키워드를 붙여줌
- Escape는 함수가 리턴되고 실행되는것을 의미
- 함수 전달인자로 전달된 클로저가 함수 종료후 호출 시 함수를 탈출
- 함수 사이 실행 순서를 조정할 수 있음
- 비동기 작업에서 많이 사용
- @escaping 키워드가 없다면 기본적으로 비탈출 클로저로 동작 (동작 후 사용할 필요가 없음)
Alamofire 서버 통신에서의 Escaping Closer예시
Alamofire.request(urlRequest).responseJSON { response in // handle response } @discardableResult public func responseJSON( queue: DispatchQueue? = nil, options: JSONSerialization.ReadingOptions = .allowFragments, completionHandler: @escaping (DataResponse<Any>) -> Void) -> Self { }
--> 이스케이핑이 붙어 함수가 반환되고 실행됨으로 요청 후 결과를 기다린 후 응답함
Auto Closure
- 자동 클로저로 함수 전달인자로 전달된 표현을 자동으로 변환
- 전달인자를 갖고 있지 않음
- 호출 시 감싸고 있는 코드의 리턴값을 반환
- 실제로 사용될 때 지연되어 호출 (메모리의 지연이 발생할 수 있음)
Auto Closure 예시
func serve(customer customerProvider: () -> String) { print("\(customerProvider())!") } serve(customer: { customersInLine.remove(at: 0) } )
-> 위와 같이 인자가없고 실제 사용될때 호출되어 반영됨
[느낀점]
클로저에 대해 항상 막막한 부분이 있었다. 함축 표현도 많기에 어디가 어떻게 클로저로 구현된거지? 이런 두려움이 있었다. 그러다보니 자연스레 클로저를 잘 사용하지 않게되고 서버 통신을 할때 많이 사용되는 비동기 작업에서 클로저로 구현된 부분에 대한 이해도 떨어졌다. 그래서 클로저를 심화적으로 더 익혀보려고 학습하였다. 클로저가 그렇게 막연한것은 아니라고 느껴졌다. 클로저는 정말 간단하게 이름없는 함수로 전달인자로도 반환으로도 사용될 수 있는것으로 형태의 낯설음이 점점 사라졌다. 실제 클로저에 대해 한걸음 다가서니 이벤트 핸들러 시 동작하는 원리와 비동기 처리에서 왜 해당 응답이 요청 후 기다렸다 되는지도 구조를 좀 더 쉽게 이해할 수 있었다.
[참고자료]
https://jusung.gitbook.io/the-swift-language-guide/language-guide/07-closures
https://duwjdtn11.tistory.com/520
https://hcn1519.github.io/articles/2017-09/swift_escaping_closure
'Swift' 카테고리의 다른 글
개념 자문자답 (0) 2021.04.29 Result (0) 2021.04.28 소켓통신 (0) 2021.04.19 Early Exit (0) 2021.04.13 Optional Chaining (0) 2021.04.12