clamp
Clamp
clamp
글쓰기 관리
전체 방문자
오늘
어제
  • 분류 전체보기 (509)
    • IOS (85)
    • SwiftUI+TCA+Combine (9)
    • RxSwift + MVVM (56)
    • Clean Architecture (12)
    • SWIFT (56)
    • iOS - TDD (2)
    • 디자인패턴 (4)
    • CS (56)
      • 알고리즘 (29)
      • 운영체제 (15)
      • 자료구조 (2)
      • 네트워킹 (4)
      • 기타 (6)
    • 회고 (0)
    • Firebase (18)
    • SwiftUI (10)
    • iOS - UIKit (11)
    • iOS - 오픈소스 (6)
    • 코딩테스트 (166)
      • 프로그래머스 (164)
    • 정보처리기사 (14)
    • GitHub (2)
글쓰기 / 관리자

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Q
  • uikit
  • Swift
  • ㅅ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
clamp

Clamp

SWIFT

[Swift] Result Type

2023. 3. 16. 16:38

💥 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)
}
저작자표시 비영리 동일조건 (새창열림)
    'SWIFT' 카테고리의 다른 글
    • [Swift] 접근 제어(Access Control)
    • [Swift] 옵셔널(Optional) ?
    • [Swift] 에러처리(Error Handling)
    • [Swift] ARC와 메모리누수(Memory Leak), weak, unowned
    clamp
    clamp
    주니어 iOS개발자의 발악!!!!!!!

    티스토리툴바