[iOS- Swift] 스위프트 필수 문법 문제 5번 풀이

TIL 12일 차 - Swift 필수 문법 문제 5번 풀이

 

필수 문제 5

 

문제 5-1.

우리는 간단한 택배 도착 예측 시스템을 만들고 있다고 가정합니다.

사용자에게 예상 도착일을 알려주려 하지만, 다음과 같은 여러 상황에서 문제가 발생할 수 있습니다:

  • 주소가 잘못된 경우
  • 배송이 아직 시작되지 않은 경우
  • 시스템 서버 에러로 예측이 불가능한 경우
  • 배송 상태를 표현하는 DeliveryStatus 열거형을 구현하고, 아래 3가지 상태를 포함하도록 합니다.
    • notStarted
    • inTransit(daysRemaining: Int)
    • error
  • 사용자 정의 에러 타입 DeliveryError를 Error 프로토콜을 따르도록 정의합니다.
    • invalidAddress
    • notStarted
    • systemError(reason: String)
// 문제 5 풀이

enum DeliveryStatus{
    case notStated
    case inTransit(daysRemaining: Int)
    case error
}

enum DeliveryError: Error {
    case invalidAddress
    case notStarted
    case systemError(reason: String)
}

 

 

 

문제 5-2.

아래 시그니처를 가진 throwing function을 구현해 봅니다.

func predictDeliveryDay(for address: String, status: DeliveryStatus) throws -> String
// 함수의 파라미터 뒤의 throws는 이 함수가 에러를 던질 수 있다는 뜻
  • 주소가 빈 문자열이면 DeliveryError.invalidAddress를 던져야 합니다.
  • 배송이 아직 시작되지 않은 경우 DeliveryError.notStarted를 던져야 합니다.
  • 시스템 에러 상태면 DeliveryError.systemError(reason:)을 던져야 합니다.
  • 나머지 경우에는 "배송까지 X일 남았습니다." 형태의 문자열을 반환합니다.

 

// throwing function
func predictDeliveryDay(for address: String, status: DeliveryStatus) throws -> String {
    
    if address.isEmpty { // 주소 유무 확인
        throw DeliveryError.invalidAddress
    } else {
        switch status {
        case .notStated:
            throw DeliveryError.notStarted
        case .error:
            throw DeliveryError.systemError(reason: "알 수 없음")
        case .inTransit(let daysRemaining):
            return("배송까지 \(daysRemaining)일 남았습니다.")
        }
    }
}

 

 

 

문제 5-3.

위 함수를 do-catch로 호출하고, 각 에러 상황에 따라 사용자에게 다른 메시지를 출력하세요.

do {
    let message = try predictDeliveryDay(for: "제주특별시", status: .inTransit(daysRemaining: 3))
    print(message)
} catch DeliveryError.invalidAddress { // 각 catch문으로 발생한 오류에 적절하게 print문을 출력함
    print("주소가 잘못입력되었습니다. 주소를 확인해주세요.")
} catch DeliveryError.notStarted {
    print("배송이 아직 시작되지 않았습니다.")
} catch DeliveryError.systemError(let reason) {
    print("시스템 에러가 발생하였습니다: \(reason)")
}

 

do-try-catch를 사용하는 이유?

에러가 날 수도 있는 함수를 실행해 보고 발생한 에러의 종류에 따라 다른 대응을 하는 것임

 

do { } 블록: 일단 시도하기

먼저 predictDeliverDay는 throws 함수이므로 반드시 try를 먼저 적어두고 호출해야 한다.

 

 

 

 

 

이번 문제에서 나오는 에러처리의 개념은 아예 몰랐던 것이라 처음 개념을 정리할 때 정확하게 정리하고 넘어가야겠다..ㅎㅎ