[swift] Swift 클로저

Swift에서 클로저는 코드 블록으로, 함수와 유사한 역할을 수행합니다. 클로저는 변수나 상수로 저장되거나 함수의 인자로 전달되거나, 함수의 반환 값으로 사용할 수 있습니다. 이번 포스트에서는 Swift 클로저에 대해 알아보겠습니다.

클로저의 기본 문법

Swift 클로저는 다음과 같은 기본 문법을 가지고 있습니다:

{ (매개변수: 매개변수타입) -> 반환타입 in
    // 클로저의 실행 코드
}

예를 들어, 다음은 두 개의 정수를 더하는 클로저입니다:

let addClosure = { (a: Int, b: Int) -> Int in
    return a + b
}

클로저는 let을 사용하여 상수로 선언하고, 클로저의 매개변수와 반환 타입은 타입 어노테이션을 사용하여 지정합니다.

클로저의 사용

클로저는 여러 가지 상황에서 유용하게 사용할 수 있습니다. 예를 들어, 클로저를 사용하여 정렬 기능을 구현할 수 있습니다. Swift의 sorted(by:) 메서드는 클로저를 인자로 받아 배열을 정렬할 수 있습니다.

let numbers = [5, 1, 3, 2, 4]
let sortedNumbers = numbers.sorted { (a, b) -> Bool in
    return a < b
}

위의 예시에서는 sorted(by:) 메서드에 클로저를 전달하여 배열을 오름차순으로 정렬하고 있습니다. 클로저는 두 개의 매개변수를 가지고 있고, Bool 값을 반환하며, 비교 연산자 <를 사용하여 정렬 순서를 결정하고 있습니다.

클로저의 간소화

Swift 클로저는 필요한 경우 간소화할 수 있습니다. 예를 들어, 매개변수 타입과 반환 타입을 생략한 경우 클로저의 타입은 컨텍스트로부터 추론될 수 있습니다.

let numbers = [5, 1, 3, 2, 4]
let sortedNumbers = numbers.sorted { a, b in
    return a < b
}

또한, 클로저의 매개변수 이름도 생략할 수 있습니다:

let numbers = [5, 1, 3, 2, 4]
let sortedNumbers = numbers.sorted {
    return $0 < $1
}

$0$1은 첫 번째와 두 번째 매개변수를 나타냅니다.

클로저의 탈출

기본적으로 클로저는 함수의 범위를 벗어나지 않습니다. 그러나, 클로저를 함수 외부로 전달하여 다른 곳에서 사용할 수 있도록 탈출 클로저로 선언할 수 있습니다. 이는 비동기 작업이나 델리게이션 패턴과 같은 경우에 유용할 수 있습니다.

func performOperation(completion: @escaping () -> Void) {
    DispatchQueue.global().async {
        // 비동기 작업 수행

        DispatchQueue.main.async {
            completion()
        }
    }
}

performOperation {
    print("작업 완료")
}

위의 예시에서 performOperation(completion:) 함수는 탈출 클로저를 인자로 받고, 비동기 작업이 완료되면 클로저를 호출합니다. 클로저는 함수 외부에서 전달되어 performOperation 함수 외부에서 사용됩니다.

결론

Swift 클로저는 유연하고 간단한 문법을 가진 강력한 기능입니다. 클로저는 함수와 마찬가지로 변수나 상수로 저장, 전달, 반환되며, 다양한 상황에서 활용될 수 있습니다. 클로저를 적절히 활용하여 코드를 간소화하고 더욱 유연한 프로그래밍을 할 수 있습니다.


참고 문서: