반응형
오류 처리
- 스위프트에서는 주로 Error 프로토콜을 이용한다.
- 열거형이다.
- 연관 값을 통해 오류에 관한 부가 정보를 제공
오류(Error) 예시
enum ExceptionError : Error{
case invalidInput;
case outOfStore;
}
throws
- 오류가 발생할 여지가 있는 함수임을 표현
class VendingMachine {
let itemPrice : Int = 100;
var itemCount : Int = 5;
var deposited : Int = 0;
func receiveMoney( money:Int) throws{
guard money > 0 else{
throw VendingMachineError.invalidInput;
}
self.deposited += money;
print("\(money)원 받음");
}
func vend(numberOfItems numberOfItemsToVend: Int) throws -> String {
// 수량이 잘못될 경우
guard numberOfItemsToVend > 0 else {
throw VendingMachineError.invalidInput
}
// 구매하는 수량보다 돈이 적을 경우
guard numberOfItemsToVend * itemPrice <= deposited else {
let moneyNeeded: Int
moneyNeeded = numberOfItemsToVend * itemPrice - deposited
throw VendingMachineError.insufficientFunds(moneyNeeded: moneyNeeded)
}
// 오류가 없으면 정상처리
let totalPrice = numberOfItemsToVend * itemPrice
self.deposited -= totalPrice
self.itemCount -= numberOfItemsToVend
return "\(numberOfItemsToVend) 제공"
}
}
do-catch
자바의 try-catch 와 같다.
do {
try machine.receiveMoney(0)
} catch VendingMachineError.invalidInput {
print("입력이 잘못되었습니다")
} catch VendingMachineError.insufficientFunds(let moneyNeeded) {
print("\(moneyNeeded)원이 부족합니다")
} catch VendingMachineError.outOfStock {
print("수량이 부족합니다")
}
// 응용 1
do {
try machine.receiveMoney(300)
} catch /*(let error)*/ {
switch error {
case VendingMachineError.invalidInput:
print("입력이 잘못되었습니다")
case VendingMachineError.insufficientFunds(let moneyNeeded):
print("\(moneyNeeded)원이 부족합니다")
case VendingMachineError.outOfStock:
print("수량이 부족합니다")
default:
print("알수없는 오류 \(error)")
}
}
// 응용 2
// 딱히 케이스별로 오류처리 할 필요가 없으면 catch를 간략화 한다.
do {
result = try machine.vend(numberOfItems: 4)
} catch {
print(error)
}
// 응용 3
// 케이스별로 오류처리할 필요가 없을 때
do {
result = try machine.vend(numberOfItems: 4)
}
try? try!
- try?
- 별도의 오류처리를 통보 받지 않고 nil로 받음.
- 정상 동작하면 정상적인 값으로 받음.
result = try? machine.vend(numberOfItems: 2)
result // Optional("2개 제공함")
result = try? machine.vend(numberOfItems: 2)
result // nil
- try!
- 오류가 발생하지 않을 것이라는 확신이 있어야 함!
- 에러가 발생하면 런타임 에러 발생
result = try! machine.vend(numberOfItems: 1)
result // 1개 제공함
반응형
'Develop > iOS' 카테고리의 다른 글
iOS 음악 재생 앱 만들기 Part#2 - Audio Method (0) | 2019.05.14 |
---|---|
iOS 음악 재생 앱 만들기 Part#1 - 앱 개발 (0) | 2019.05.14 |
Swift 익스텐션 (0) | 2019.05.13 |
Swift 프로토콜 (Protocol) (0) | 2019.05.10 |
Swift assert 와 guard (0) | 2019.05.10 |