Open withseon opened 5 months ago
빨리좀 작성해주세요 궁금해요
아직 기다리고 있는데......
Result 타입에 대해 설명하기 전에, 에러 처리 과정에 대해 먼저 살펴보자.
첫번째, 어떠한 에러가 발생할 것인지를 정의한다.
enum HeightError: Error { // Error 프로토콜 채택
case maxHeight
case minHeight
}
Error
프로토콜을 채택한 열거형으로 정의한다.두번째, throwing 함수 구현
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
}
}
}
throws(throw)
키워드를 사용하여, 특정 조건에서 에러를 던질 수 있는 함수를 구현한다.세번째, 에러 처리
do {
let _ = try checkingHeight(height: 200)
print("놀이기구 탑승 가능")
} catch {
print("놀이기구 탑승 불가")
}
// 놀이기구 탑승 불가
try-catch
문을 사용하여 던져진 에러를 받아 catch문의 print()를 실행하게 된다.결과를 넣은 타입
애플 공식 문서에서 찾아볼 수 있는 Result 타입의 내부 구현
@frozen
enum Result<Success, Failure> where Failure : Error
case success(Success)
와 case failure(Failure)
를 갖는다.제네릭 열거형 제네릭 타입의 매개변수를 사용하여 case가 각각 다른 타입의 값을 가질 수 있게 하는 열거형
첫번째, 위에 있으니까 생략
두번째, 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)
}
}
}
throws(throw)
키워드를 사용하지 않고, Result 타입을 리턴한다.세번째, 에러 처리
let result = resultTypeCheckingHeight(height: 200)
// 처리
switch result {
case .success(let data): // 연관값을 바인딩
print("결과값은 \(data)입니다.")
case .failure(let error):
print(error)
}
switch-case
문으로 각 Result 타입의 각 case(success, failure)에 따른 처리를 해준다.성공과 실패의 경우를 깔끔하게 처리할 수 있기 때문에
기존의 에러 처리는 단순히 데이터나 오류 메세지로만 구성이 되어 있다. 따라서, 실제 함수를 호출하는 곳에서 에러 형식을 특정 짓기 어렵다는 단점이 있다.
그에 반해 Result 타입은 함수 정의 시 에러 타입을 명시함으로써 에러 형식을 특정 지을 수 있다.
성공과 실패에 대한 두 가지 case를 사용함으로써 명확한 의미를 전달
해주기 때문에 코드의 가독성이 높다.
함수에서 직접 결과를 반환하기 때문에, 호출된 지점에서 바로 처리
가 가능하다.
그리고 map(), mapError(), flatMap(), flatMapError() 메소드를 지원하기 때문에 추가적인 활용이 가능
하다는 특징이 있다.
하지만 Result 타입은 기존의 에러 처리를 완전히 대체하기 위해 사용되는 것은 아니다. 보다 에러 처리를 명확하게 하고, 코드를 간결하게 쓸 수 있도록 돕는 에러처리 방식 중 하나이다.
Result 타입 쓰면 성공/실패 여부와 에러 타입이 명확하며 코드의 가독성이 향상된다. 결과를 직접 반환하기 때문에 호출된 지점에서 에러 처리가 가능하다. 에러 처리 방법 중 하나일 뿐이다.
기다리는중이에요. 궁금하네요. 이유랑 장점이 뭔가요??