[swift] 클로저를 이용한 콜백 함수

콜백 함수는 비동기 작업에서 결과를 받았을 때 실행되는 함수입니다. Swift에서는 클로저를 이용하여 콜백 함수를 구현할 수 있습니다. 클로저는 일급 객체로서 함수와 비슷한 형태를 가지며, 코드 블록을 변수로 저장하거나 전달할 수 있습니다.

클로저 정의하기

클로저를 정의하기 위해서는 다음과 같은 형태로 작성합니다:

{ (매개변수) -> 반환타입 in
    // 클로저 내부 코드
}

예를 들어, 정수를 더하는 클로저를 작성해보겠습니다:

let addClosure = { (x: Int, y: Int) -> Int in
    return x + y
}

이제 addClosure 클로저는 두 개의 정수를 받아 더한 결과를 반환하는 함수처럼 사용할 수 있습니다.

클로저를 콜백 함수로 사용하기

비동기 작업에서 처리된 결과를 받아올 때, 클로저를 콜백 함수로 사용할 수 있습니다. 보통 비동기 작업은 백그라운드 스레드에서 실행되고, 결과가 준비되었을 때 클로저가 실행됩니다.

예를 들어, 네트워크 요청 결과를 받는 경우 다음과 같이 클로저를 콜백 함수로 사용할 수 있습니다:

func fetchData(completion: @escaping (Data?, Error?) -> Void) {
    // 네트워크 요청
    // ...
    
    // 요청 결과 처리
    if let data = responseData {
        completion(data, nil)
    } else {
        completion(nil, error)
    }
}

위 예제에서 fetchData 함수는 completion 클로저를 매개변수로 받습니다. 네트워크 요청 결과가 준비되면, completion 클로저를 실행하여 데이터와 오류를 전달합니다.

함수를 호출할 때 클로저를 전달할 수 있습니다:

fetchData { (data, error) in
    if let data = data {
        // 데이터 가공
        // ...
    } else if let error = error {
        // 오류 처리
        // ...
    }
}

위 예제에서는 클로저에서 데이터를 받아올 때와 오류를 처리할 때 각각 다른 로직을 구현할 수 있습니다.

마무리

Swift에서는 클로저를 사용하여 콜백 함수를 표현할 수 있습니다. 클로저는 비동기 작업에서 결과를 받거나 오류 처리를 할 때 유용하게 사용됩니다. 사용 시 정확한 형식에 맞추어 클로저를 정의하고 콜백 함수로 등록해야 합니다.