Result Type

썹스·2022년 12월 4일
0

Swift 문법

목록 보기
47/68

Result Type의 등장 배경

Result Type은 Swift5 이후에 나온 기능입니다.

Swift5 이전에 사용하던 에러 처리(Error Handling)의 단점과 불편한 점을 보완하고자 나왔으며, 코드의 간결화 및 가독성 향상 등의 장점을 가지고 있습니다.

📌 기존 에러 처리(Error Handling)

✅ 1단계: 에러 정의

  • 어떤 경우의 에러가 발생할지 미리 정의해야 합니다.
  • 개발자는 열거형 타입으로 에러를 정의해야 하며, 에러 프로토콜(Error)을 채택해야 합니다.
enum NameError: Error{  // 개발자가 만든 열거형 타입의 에러에 에러 프로토콜(Error)을 채택
    case noName
}

✅ 2단계: 에러 발생 함수 정의

  • 에러가 발생할 수 있는 함수를 정의할 때는 파라미터(parameter) 괄호 다음에 throws라는 키워드를 작성해야 합니다.
  • throws라는 키워드를 통해 해당 함수는 "에러를 던질 수 있는 함수 타입"으로 변합니다.
func checkingName(name: String) throws -> String{   // throws라는 키워드를 작성
    if name.isEmpty{
        throw NameError.noName
    }
    else{
        return name
    }
}

✅ 3단계: 에러 발생 함수 실행

  • throws라는 키워드가 들어간 함수는 바로 사용할 수 없습니다.
  • 에러 발생 함수를 실행하기 위해서는 "do{ try }, catch{ }" 문법을 사용해야 합니다.
do{     // 함수를 실행하는 블럭
    try print(checkingName(name: "김철수"))
}
catch{  // 에러를 처리(실행)하는 블록
    print("이름이 없습니다.")
}

🤔 기존에 사용하던 에러 처리(Error Handling)에는 무슨 단점과 불편한 점이 있었을까??

코드를 작성하면서 많은 개발자들이 느낀 단점과 불편한 점은 아래와 같았습니다. (뇌피셜 입니다.)

  1. 에러를 처리하기 위해 많은 키워드(throws, throw, do{ }, try, catch{ })를 사용

  2. 키워드를 많이 사용하다 보니 코드가 복잡해짐 -> 가독성 하락

  3. 실재 함수를 호출하는 곳에서 어떤 에러 형식 던지는지 특정짓기 어려움


이러한 에러 처리(Error Handling)의 단점과 불편한 점을 보완하고자 나온 것이 바로 "Result Type"입니다.


Result Type

Result Type은 열거형(enum)으로 이루어져 있으면, 기본적인 연관값(Associated Value)을 가지고 있는 제네릭(Generics) 열거형입니다.

enum Result<Success, Failure> where Failure : Error
  • Success에는 모든 타입이 들어갈 수 있습니다.

  • Failure에는 Error 프로토콜을 채택한 타입만 들어갈 수 있습니다.


📌 Result Type을 사용한 에러 처리

✅ 1단계: 에러 정의

  • 어떤 경우의 에러가 발생할지 미리 정의해야 합니다.
  • 개발자는 열거형 타입으로 에러를 정의해야 하며, 에러 프로토콜(Error)을 채택해야 합니다.

    Result Type을 사용할 경우에도 기본적으로 에러를 정의해줘야 합니다.
enum NameError: Error{  // 개발자가 만든 열거형 타입의 에러에 에러 프로토콜(Error)을 채택
    case noName
}

✅ 2단계: 에러 발생 함수 정의

  • 에러가 발생할 수 있는 함수를 정의할 때는 반환 타입을
    "Result<반환 타입, Error 프로토콜을 채택한 에러 타입>"로 구현해야 합니다.

  • 에러를 던질 때는 throw가 아닌 return을 사용하여 반환합니다.
func checkingName(name: String) -> Result<String, NameError>{
    if name.isEmpty{
        return Result.failure(NameError.noName)
    }
    else{
        return Result.success(name)
    }
}

✅ 3단계: 에러 발생 함수 실행

  • 에러 발생 함수를 변수(상수)에 할당하여 switch 문과 함께 사용하면 활용성을 높일 수 있습니다.
    (에러 발생 함수의 타입은 Result<Success, Failure>이지만, 근본적으로 Result 타입 자체가 열거형으로 만들어지기 때문에 switch 문과 함께 사용하면 다양한 표현이 가능)
let A = checkingName(name: "김철수")
let B = checkingName(name: "")

switch A{
case .success(let data):
    print(data)
case .failure(let error):
    print(error.rawValue)
}
// 김철수

switch B{
case .success(let data):
    print(data)
case .failure(let error):
    print(error.rawValue)
}
// 에러: 이름이 없습니다.

에러 처리(Error Handling) VS Result Type

Result Type을 활용한 에러 처리는 코드의 간결화, 가독성 향상 등의 장점을 가지고 있지만 기존 에러 처리(Error Handling)를 완전하게 대체하는 것은 아닙니다.

상황에 맞는 에러 처리 방식을 선택하여 코드를 작성하는 것이 중요합니다.

그러므로 어떠한 방식이 더 좋은 방식이라 단정하는 것은 어렵다고 생각합니다.

profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글