IOS
Swift) 문법 정리 - @escaping
seong_hye
2022. 7. 19. 20:59
📘 Swift 문법 정리: @escaping
클로저를 사용할 때 사용하게 되는 @escaping에 대해 자세히 알아보자
🔹 문법 설명
@escaping은 클로저가 함수의 실행이 끝난 후에도 실행될 수 있음을 나타내는 키워드
즉, 클로저가 함수 외부에서 나중에 호출될 가능성이 있다면 Swift는 명시적으로 @escaping 키워드를 요구함
비동기 처리, API 응답, 딜레이 작업 등에서 주로 사용되며
잘못 사용하면 메모리 누수나 컴파일 에러로 이어질 수 있다.
🔹 예제 1 : 비동기 작업
func fetchData(completion: @escaping (String) -> Void) {
DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
completion("데이터 수신 완료")
}
}
📌 completion 클로저는 함수 fetchData가 끝난 후에도 비동기적으로 실행되기에 @escaping이 필요함
🔹 예제 2: 클로저를 외부 변수에 저장
var storedClosure: (() -> Void)?
func saveTask(task: @escaping () -> Void) {
storedClosure = task
}
📌 클로저를 함수 외부 변수에 저장 -> 함수 종료 이후에도 실행될 수 있으므로 @escaping이 필요함
🔹 메모리 누수 주의: @escaping + self
클로저가 self를 캡처하면 강한 참조 순환 위험이 있다.
func doSomething() {
fetchData { [weak self] result in
self?.handle(result)
}
}
➡️ @escaping 클로저에서는 항상 [weak self] 또는 [unowned self]를 고려해야 함
🔹 자주 사용되는 곳
- 네트워크 요청 (URLSession)
- 애니메이션 완료 처리
- 딜레이 처리 (GCD)
- Notification, delegate에서 클로저 방식으로 처리할 때