카테고리 없음

Swift) escaping 클로저

나태한개발 2024. 6. 24. 22:35

Escaping 클로저란?

Swift에서 클로저는 일종의 함수 블록으로, 코드의 나중 실행을 위해 저장될 수 있다. 클로저는 비동기 작업이나 콜백 처리 시 자주 사용된다. 클로저가 함수의 인자로 전달될 때, 클로저가 함수의 실행이 종료된 후에도 실행될 수 있다면, 이를 "escaping 클로저"라고 한다.

기본적으로 함수 인자로 전달된 클로저는 함수가 반환된 후에는 더 이상 사용되지 않지만, escaping 클로저는 함수가 반환된 후에도 실행될 수 있다. 이는 클로저가 함수 외부에서 호출되거나 저장될 수 있기 때문이다.

 

Escaping 클로저의 사용 예시

import Foundation

// 비동기 작업을 수행하는 함수 정의
func performAsyncTask(completion: @escaping () -> Void) {
    // 비동기 작업 시뮬레이션
    DispatchQueue.global().async {
        // 작업 완료 후 클로저 호출
        completion()
    }
}

// 함수 호출
performAsyncTask {
    print("비동기 작업 완료!")
}

위 예제에서 performAsyncTask 함수는 클로저를 인자로 받는다. 이 클로저는 함수가 반환된 후에 실행되므로 @escaping 키워드가 필요하다. DispatchQueue.global().async는 비동기 작업을 수행하며, 작업이 완료된 후에 클로저를 호출한다.

 

Escaping 클로저의 활용

Escaping 클로저는 주로 비동기 작업이나 콜백 처리에 사용된다. 예를 들어, 네트워크 요청을 처리하고 응답을 받아야 하는 경우, escaping 클로저를 사용하여 응답 처리 코드를 작성할 수 있다.

import Foundation

// 네트워크 요청을 시뮬레이션하는 함수 정의
func fetchData(url: String, completion: @escaping (Data?) -> Void) {
    // 비동기 네트워크 요청 시뮬레이션
    DispatchQueue.global().async {
        // 데이터를 다운로드했다고 가정
        let data = Data()
        
        // 작업 완료 후 클로저 호출
        completion(data)
    }
}

// 함수 호출
fetchData(url: "https://example.com") { data in
    if let data = data {
        print("데이터 수신 완료: \(data)")
    } else {
        print("데이터 수신 실패")
    }
}

위 예제에서 fetchData 함수는 URL을 인자로 받아 데이터를 비동기적으로 가져온다. 데이터를 가져오는 작업이 완료된 후, completion 클로저를 호출하여 결과를 전달한다. 이 과정에서 escaping 클로저를 사용하여 비동기 작업이 완료된 후에도 클로저를 실행할 수 있도록 한다.