💥 Result 타입
Swift5.0에서 추가된 Result Type는 새롭게 추가된 에러처리 방법이다.
Result를 이해하기 위해선 열거형(Enum), 연관값(Associated Value), 제네릭(Generic)을 이해하고 있어야 한다.
- 에러가 발생하는 경우, 에러를 따로 외부로 던지는 것이 아니라
- 리턴타입 자체를 Result Type으로 구현해서
- 함수 실행의 성공과 실패 정보를 함께 담아서 리턴한다.
- 타입 하나에 정상적인 경우, 에러를 담을 수 있게 구현됨.
기존의 에러처리인 경우 불편한 점이 있다. 에러가 발생하는 경우와 정상적인 경우를 따로 처리해야하고, do catch블럭으로 감싸서 처리해야한다.
❓ Result타입의 구현
Result 타입은 열거형으로 구현되어있다.
enum Result<Success, Failure> where Failure: Error{
case success(Success)
case failure(Failure)
}
Failure의 경우 Error프로토콜을 채택한 경우에만 가능하다.
함수 실행의 결과를 정상적인 경우는 Success에 담고, 에러가 발생한 경우는 Failure에 담아서 case의 연관값으로 전달한다.
❗️예시
에러정의
enum HeightError: Error { //에러 프로토콜 채택 (약속)
case maxHeight
case minHeight
}
throws를 활용한 에러처리
func checkingHeight(height: Int) throws -> Bool { // (에러를 던잘수 있는 함수 타입이다)
if height > 190 {
throw HeightError.maxHeight
} else if height < 130 {
throw HeightError.minHeight
} else {
if height >= 160 {
return true
} else {
return false
}
}
}
do {
let _ = try checkingHeight(height: 200)
print("놀이기구 타는 것 가능")
} catch {
print("놀이기구 타는 것 불가능")
}
Result타입을 활용한 에러처리
// Result<Success, Failure> ==> Result<정상적인리턴타입, 에러타입>
func resultTypeCheckingHeight(height: Int) -> Result<Bool, HeightError> {
if height > 190 {
return Result.failure(HeightError.maxHeight)
} else if height < 130 {
return Result.failure(HeightError.minHeight)
} else {
if height >= 160 {
return Result.success(true)
} else {
return Result.success(false)
}
}
}
// 리턴값을 받아서
let result = resultTypeCheckingHeight(height: 200)
// 처리
switch result {
case .success(let data):
print("결과값은 \(data)입니다.")
case .failure(let error):
print(error)
}
// Result타입에는 여러메서드가 존재
// get()메서드는 결과값을 throwing함수처럼 변환가능한 메서드 (Success밸류를 리턴)
do {
let data = try result.get()
print("결과값은 \(data)입니다.")
} catch {
print(error)
}