iOS Result 타입 (예외처리)

Result 타입 이란?

함수나 메서드에서 성공 또는 실패를 반환하는데 사용되는 형식이며, 주로 비동기 작업 진행 시 사용된다.

Swift5 에서 새로 추가된 Result Type를 이해하기 위해선 열거형 , 연관값, 제네릭을 이해하고 있어야 한다.

 

에러가 발생하는 경우, 에러를 따로 외부로 던지는 것이 아니라 리턴 타입 자체를 Result 타입으로 구현해서 함수 성공과 실패 정보를 담아 리턴한다.

 

장점으로 실제 함수 정의시에 에러 타입을 명시적으로 선언하며 타입캐스팅이 불필요하다는 점이 있다.


Result Type 처리 3단계

(1) 에러타입 정의

먼저 Error 프로토콜을 채택해 열거형을 통해 에러 타입을 지정해둔다.

enum Result<Success, Failure> where Failure: Error{
    case success(Success)
    case failure(Failure)
} 

Failure의 경우 Error프로토콜을 채택한 경우에만 사용이 가능하다.

 

(2) 함수 정의

함수 내부 정의에서 정상적인 경우 .success 리턴, 비정상적인 경우 .failure 리턴 하도록 정의한다.

예시는 네트워킹 과정에서 사용되는 함수를 사용했다.

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)
        }
    }
}

 

(3) 결과 처리

하나의 열겨형 타입을 처리하는 일방적인 방식으로 직관적이고 깔끔한 코드 구성이 가능해진다.

switch result {
case .success(let data):
    print("결과값은 \\(data)입니다.")
    
case .failure(let error):
    print(error)
}

Result 타입으로 바꾸는 이유

  • 성공 / 실패의 경우를 깔끔하게 처리하여 명시적인 에러 처리가 가능하다. 호출할때 해당 에러를 바탕으로 적절하게 대응할 수 있다.
  • Result 타입을 사용하면 예외 처리를 통해 예상치 못한 동작이 발생하는 것을 방지할 수 있다.
  • 비동기 작업에서 작업의 성공 또는 실패에 대한 명확한 결과를 반환할 수 있다.
  • 기존의 에러처리 패턴을 완전히 대체하려는 목적은 아니고 개발자에게 에러 처리에 대한 다양한 처리 방법의 옵션을 제공한다.

결론적으로 Swift의 Result 타입은 함수나 메서드에서 성공 또는 실패를 명시적으로 처리하고 안전하고 명확한 코드를 작성하는데 유용하다.