[iOS][Swift] 클로저, 이스케이핑 클로저, 예외처리

Jay·2023년 7월 21일
0

iOS

목록 보기
5/47

1. 클로저 (Closures)

클로저는 스스로를 포함한 주변 문맥의 상수와 변수를 참조하고 캡처할 수 있는 독립적인 코드 블록입니다. 스위프트의 함수는 이름이 있는 클로저입니다. 클로저는 파라미터와 반환 값의 타입을 통해 캡처된 상수와 변수의 값을 주고받을 수 있습니다.

클로저의 주요 특징 중 하나는 "trailing closure syntax"로, 함수의 마지막 인수로 전달하는 클로저에 대해서는 함수 호출의 괄호를 닫은 후 작성할 수 있습니다.

클로저 표현을 간소화하기 위해 Swift는 타입 추론과 익명 파라미터를 제공합니다. 예를 들어, $0, $1, $2 등으로 익명 파라미터를 통해 클로저의 인자를 간결하게 표현할 수 있습니다.

예시코드:

let numbers = [1, 2, 3, 4, 5]
let doubledNumbers = numbers.map { $0 * 2 } 
// [2, 4, 6, 8, 10]

2. 이스케이핑 클로저 (Escaping Closures)

스위프트에서, 클로저를 함수의 인자로 전달하게 되면 그 클로저는 기본적으로 "non-escaping"입니다. 이는 클로저가 함수가 끝나기 전에 실행(또는 호출)되며, 이후에는 해당 클로저가 존재하지 않음을 의미합니다.

반면에 이스케이핑 클로저는 함수가 종료된 이후에도 호출되거나 저장되어 사용될 수 있습니다. 이스케이핑 클로저는 비동기 작업에서 많이 사용됩니다. 예를 들어 네트워크 요청이나 타이머에 의해 트리거되는 작업 등에서 주로 사용됩니다.

이스케이핑 클로저를 사용하는 이유는, 보통 함수가 종료된 후에도 어떤 작업을 계속해서 진행하거나 완료해야 하는 경우에 필요합니다. 이는 주로 비동기 작업에서 발생하며, 이때 이스케이핑 클로저를 사용하면 해당 작업을 적절하게 처리할 수 있습니다.

예시코드:

var completionHandlers: [() -> Void] = []

func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}

someFunctionWithEscapingClosure {
    print("Completion handler called")
}

// When you need to call the closures
for handler in completionHandlers {
    handler()
}

3. 예외 처리 (Error Handling)

Swift에서 예외 처리는 런타임 에러를 식별하고, 프로그램 흐름을 복구할 수 있게 해주는 프로세스입니다. do-catch 문을 사용해서 예외를 처리하며, 함수는 throws 키워드를 사용하여 에러를 던질 수 있음을 선언합니다.

예외 처리를 사용하는 이유는 프로그램이 예상치 못한 문제에 직면했을 때 그 문제를 적절하게 처리하고 프로그램의 제어 흐름을 복구하기 위해서입니다. 이를 통해 소프트웨어가 예외 상황에서도 안정적으로 동작할 수 있게 됩니다.

이로써, 클로저와 이스케이핑 클로저, 그리고 예외 처리는 Swift에서 코드를 더 안정적이고, 강력하며, 유연하게 작성하는데 도움을 주는 중요한 요소들입니다. 이들의 이해는 Swift 언어를 보다 깊이 있게 이해하고 활용하는 데 있어 필수적입니다.

예시코드:

enum PrinterError: Error {
    case outOfPaper
    case noToner
    case onFire
}

func sendToPrinter(_ printerName: String) throws -> String {
    if printerName == "Never Has Toner" {
        throw PrinterError.noToner
    }
    return "Job sent"
}

do {
    let printerResponse = try sendToPrinter("Never Has Toner")
    print(printerResponse)
} catch {
    print(error)
}
profile
Junior Developer

0개의 댓글