TIL 12일 차 - Swift 필수 문법 문제 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를 먼저 적어두고 호출해야 한다.
이번 문제에서 나오는 에러처리의 개념은 아예 몰랐던 것이라 처음 개념을 정리할 때 정확하게 정리하고 넘어가야겠다..ㅎㅎ
'iOS > Swift ' 카테고리의 다른 글
| [iOS-Swift] ARC (1) | 2026.01.12 |
|---|---|
| [iOS-Swift] 클로저 closure 심화 (0) | 2026.01.12 |
| [iOS-Swift] 스위프트 필수 문법 문제 4번 풀이 (0) | 2026.01.10 |
| [iOS- Swift] 스위프트 필수 문법 문제 3번 풀이 (0) | 2026.01.09 |
| [iOS- Swift] 스위프트 필수 문법 문제 2번 풀이 (0) | 2026.01.09 |