카테고리 없음
Swift-Result타입
Kendrick
2023. 3. 23. 00:19
Result타입이란?
Result 타입은 보다 진보된 에러처리 방법이라고 생각하면 편하다.
Result 타입의 특징은 다음과 같다.
- 내부적으로 열거형으로 구현되어있음
- 타입하나에 에러를 담을 수 있게 해줌
- 에러를 처리하는 방법 중 하나
- 좀 더 깔끔한 코드 작성이 가능해짐
사용예시
다음과 같은 상황에 있다고 가정해보자,
권군은 과자를 사러 편의점에 갔다, 결제를 하려 했지만 지급을 두고나와 카카오페이를 사용해야 한다.
카카오페이 잔액을 확인해보니 정확하게 3500원이 있는 권군은 3,500원에 딱 맞춰서 고르면 되는 상황
위와 같은 상황을 코드로 표현해보면 아래와 같은 코드로 작성 될 수 있다.
1. 일반적인 do-catch 블록을 활용한 에러처리
//1. 에러타입 정의
enum Kakaopay: Error {
case tooMuchMoney
case lowMoney
}
//2. 함수정의
func payMoment(paymoney: Int) throws -> Bool {
if paymoney > 3500 {
throw Kakaopay.tooMuchMoney
} else if paymoney < 3500 {
throw Kakaopay.lowMoney
} else {
if paymoney == 3500 {
return true
} else {
return false
}
}
}
//3. 에러처리
do {
let try1 = try payMoment(paymoney: 3500)
print("결제성공")
} catch {
print("결제실패")
}
//"결제성공"
2. Result 타입을 활용한 에러 처리
//Result타입으로 처리하면 키워드 불필요 불필요
func payMoment1(paymoney: Int) -> Result<Bool, Kakaopay> {
//하나의 타입이됨(제네릭이기 때문에 어떤 타입도 가능) , 성공시 연관값에 Bool타입을 주고 실패시 연관값에 Kakaopay의 정보를 줌
if paymoney > 3500 {
return Result.failure(Kakaopay.tooMuchMoney)
//Kakaopay는 열거형이기 때문에 구체적인 선언을해줘야함. 즉,돈이 너무 많아서 에러야~
} else if paymoney < 3500 {
return Result.failure(Kakaopay.lowMoney)
} else {
if paymoney == 3500 {
return Result.success(true)
} else {
return Result.success(false)
}
}
}
let money = payMoment1(paymoney: 3500)
switch money {
case .success(true):
print("결제성공")
case .failure(Kakaopay.lowMoney):
print("결제실패")
case .failure(Kakaopay.tooMuchMoney):
print("결제실패")
case .success(false):
print("결제실패")
}
//결제성공
//또는 아래와 같이 코드를 작성 할 수 있다.
let money1 = payMoment1(paymoney: 3500)
switch money1 {
case .success(_):
print("결제성공")
case .failure(_):
print("결제실패")
}
//결제성공
do-catch 블록을 활용한 에러처리의 프로세스가 에러정의 -> 함수정의 -> do-catch 블록 활용(에러처리) 순수였다면
Result타입을 활용한 에러처리는
에러정의 -> 함수정의 -> switch문 활용(에러처리)의 프로세로 에러를 처리한다.
또한 다음과 같은 이점을 갖고 갈 수 있다.
- throws, throw, try 같은 키워드 불필요
- 코드 가독성 높아짐
- switch문을 통해 처리 가능
Result타입을 정리해보면
- switch문으로 에러처리가 가능하다.
- 에러처리 시 throws와 같은 키워드 사용을 안해도된다.
- 제네릭형식으로 모든 타입을 쓸 수 있다.
- 사용시 do-catch를 사용하여 에러를 처리하는 것 보다 코드 가독성이 높아진다.