[Swift] Result Type

GomHyeok·2024년 6월 20일

회고록

목록 보기
12/18

API연결을 연습하며 Data 영역에서 그 값을 넘겨주는 값에 Result 타입을 사용해야 한다는 것을 알 수 있었다.
Result Type..? 무엇인지 잘 모르겠다


📙 에러처리

📚 기존의 방법

Result Type은 Error를 처리하기 위해 나온 Type이라고 한다.
비교를 위해 기존의 에러 처리 방법을 알아보면

do {
	try functino()
} catch errorType {

} catch errorType2 {

}

위의 같은 형태로 에러처리를 진행했다. 이러한 방법에는 단점이 있다.

  • 3단계의 과정을 거쳐야 해서 functino에서는 단순이 error를 던지기만 한다
    - do-catch 과정을 봐야 어떠한 과정으로 이어지는지 알 수 있다.
  • throws를 통해 어떤 에러를 던지는지 특정하기 어렵다

이러한 단점을 개선하고자 나온 것이 바로 Result Type이다.
그렇다면 어떠한 점이 더 좋은 것일까?

📚 Result Type

정의

Generic Enumeration
A value that represents either a success or a failure, including an associated value in each case
즉 경우에 따른 값을 통해 성공과 실패를 나타내는 것이다.

선언

@frozen enum Result<Success, Failure> where Failure : Error

잠깐 @frozen은 무엇인지 모르겠다
구조체 또는 열거형 Declaration에 적용하여 타입의 변경을 제한하는 것이다. 즉 더이상 해당 구조체, 열거형에 변화가 없음을 알려주는 신호라고 생각할 수 있다. 하지만 이 또한 Libarary evolution support가 켜저 있을 때만 컴파일 시 허용된다 하지만 기본적으로 꺼져있으며 그러한 경우 암시적으로 모든 구조체와 열거형이 frozen 속성이 된다.

그러면 Libarary evolution support는 무엇인가?
프레임워크가 소스 코드 및 바이너리 호환성을 지키면서 버전을 올릴 경우, 프레임 워크를 사용하는 앱을 다시 컴파일 하지 않도록 되게 하는 기능이다.

그렇다면 이걸 어떻게 사용해야 하는 것인가

enum APIError : Error {
	case errorCase1
   	case errorCase2
    case errorCase3
}


func APIcall(parameter : String) -> Result<Bool, APIError> {
	if parameter == "case1" {
    	return .failure(.errorCase1)
    }
    if parameter == "case2" {
    	return .failure(.errorCase2)
    }
    if parameter == "case3" {
    	return .failure(.errorCase3)
    }
    
    return .success(true)
}

let isSuccess = APICall("case1")
switch isSuccess {
case .success(let data) :
	print(data)
case .failure(let error) :
	print(error)
}

기존 코드들과의 차이는 Result Type을 return하고 throws하는 부분이 없다.
또한 Result를 사용하는 경우 <성공 경우의 타입, 실패 경우> 이런 식으로 사용한다.
이를 통해 switch문을 통해 success, failure의 경우에 따라 처리할 수 있다.

성공한 경우만 다루는 방법!

switch를 통해 성공, 실패를 모두 다루지 않고 성공한 경우만 다루는 방법도 존재한다.

if let result = try? isSuccess.get() {}

이렇게 코드를 작성하면 성공한 경우만 다룰 수 있게 된다. 그렇다면 get을 사용하는건 어떤 의미일까?
get -> 성공 했을 경우만 throw하는 표현식으로 return 한다. 즉 실패한 경우에는 위의 구문을 타지 않게 된다.


기존에는 호출 결과를 무조건 성공의 경우만 생각하고 에러의 경우를 깊게 고려하지 못하였다.
Result Type을 사용하여 에러를 피하는 것이 아닌 처리를 할 수 있도록 만드는 것이 중요하다는 것을 알 수 있었다.

profile
github : https://github.com/GomHyeok/

0개의 댓글