타입을 체크하는 연산자 - 런타임 시점에 체크가 이루어짐
as : 업캐스팅
: 서브 클래스 인스턴스를 슈퍼 클래스 타입으로 참조
⇒ 항상 성공! (실패할 경우 에러 발생)
as? as! : 다운캐스팅
: 슈퍼 클래스 인스턴스를 서브 클래스 타입으로 참조
⇒ 실패 가능성이 있으므로 as?, as!와 같은 형태로 연산자 사용
→ as? : 런타임 시점에 타입 캐스팅을 하며, 실패할 경우 nil 리턴
→ as! : 런타임 시점에 타입 캐스팅을 하며, 실패할 경우 에러 발생
참고: Swift) is, as - 타입 캐스팅 (Type Casting) - 개발자 소들이
for element in introducibleArr {
if element is Robot {
let instance = element as? Robot
instance?.batteryCharge()
} else if element is Cat {
let instance = element as? Cat
instance?.meow()
} else if element is Dog {
let instance = element as? Dog
instance?.bark()
} else {
continue
}
}
→ is 연산자로 타입 체크 후 다운캐스팅하여 고유 메서드를 실행
enum DeliveryError: Error {
case invalidAddress
case notstarted
case systemError(reason: String)
}
func predictDeliveryDay(for address: String, status: DeliveryStatus) throws -> String {
// 주소가 잘못된 경우
if address.isEmpty {
throw DeliveryError.invalidAddress
}
// DeliveryStatus에 따른 분기 처리
switch status {
case .notStarted: // 배송이 아직 시작되지 않은 경우
throw DeliveryError.notstarted
case .error: // 시스템 서버 에러로 예측이 불가능한 경우
throw DeliveryError.systemError(reason: "서버 에러")
case .inTransit(dayRemaining: let day): // 정상 배송 상태
return "배송까지 \(day)일 남았습니다."
}
}
→ 매개변수로 받는 status: DeliveryStatus 열거형 타입 변수 처리 시 패턴 매칭 사용!
⇒ case .inTransit(dayRemaining: let day):
do {
// 오류 던지는 함수 호출 (try 와 함께!)
try print(predictDeliveryDay(for: "우리집", status: notStarted))
} catch DeliveryError.notstarted { // 던진 에러 타입에 따라 catch 블록에서 처리
print("아직 배송이 시작되지 않았습니다.")
} catch DeliveryError.invalidAddress {
print("유효하지 않은 주소입니다.")
} catch DeliveryError.systemError(reason: let reason) { // 열거형(에러타입) 패턴 매칭
print("시스템 에러입니다. 사유: \(reason)")
} catch {
print("그 외 오류 발생: \(error)")
}
→ do 블록 내에서 함수 호출
: try - 오류 타입에 따라, 혹은 암시적으로 들어오는 에러가 있을 때 catch 블록 내에서 처리
: try? - 오류 발생 시 반환값을 옵셔널 값으로 변환하여 처리
: try! - 오류를 던질 수 있는 함수가 오류가 절대 발생하지 않을 것을 확신할 때 사용(오류 발생 시 런타임 에러 발생)
➡︎ 열거형 패턴매칭과 오류 처리에 익숙해지자!
참고: [Swift] 기초 문법 - 예외처리(throws, do-catch, try) - potatos' devlog
프로그래머스 Lv.1 달리기 경주
→ 연산 시간 신경쓰면서 구현하기
→ 다양한 시각으로 생각하는 연습하기...
프로그래머스 Lv.1 추억 점수
→ reduce 메소드 사용 방법 숙지하기 - 맨날 까먹음
→ compactMap : 옵셔널 값을 언래핑하여 기존 배열 형태로 반환 (nil값은 제외함)
→ flatMap : (옵셔널 값을 언래핑하여) 1차원 배열 형태로 반환
(nil값 제외됨. 단, 옵셔널 언래핑 기능은 compactMap으로 이관되었으므로 해당 용도로는 compactMap 사용)