Swift 6 - Typed throws 등장

김재형·2024년 10월 14일
0
post-custom-banner

들어가기에 앞서

Swift6 1편 부터 봐주시기를 권장 드립니당

Typed throws에 대해서

영어 그대로 해석해 본다면 "타입을 던지다!" 로 해석이 되는 문장인데요.
이게 무슨 말일까요? 한번 아래 참고문서 내용을 읽어 보겠습니다.

  • 참고문서 https://github.com/swiftlang/swift-evolution/blob/main/proposals/0413-typed-throws.md

    Swift의 오류 처리 모델은 throws오류를 throw하여 종료할 수 있음을 나타내는
    표시된 함수와 클로저를 허용합니다. 오류 값 자체는 항상 any Error이므로 유형이 지워집니다.
    any Error 접근 방식은 오류를 일반적으로 처리하도록 장려하며 대부분 코드에 대한
    좋은 기본 설정으로 남아 있습니다.

    그러나 유형 지우기가 불행한 경우가 있는데,모든 오류를 처리하고 처리하기 위해
    가능하고 바람직한 좁은 곳에서 더 정확한 오류 타이핑을 허용하지 않거나 유형 지우기의 비용이
    너무 비싼 경우가 있기 때문입니다.

무슨말인지 알다가도 이해가 안될수도 있을것 같아요!
Swift5 에선 에러를 어떻게 처리했는지 생각해볼까요?

enum CustomError: Error {
    case firstError
    case secondError
}

struct Test {
   
    func test() throws {
        if Bool.random() {
            return
        } else {
            throw (Bool.random() ? CustomError.firstError : CustomError.secondError)
        }
    }
    
    func callTest() {
        do {
            try test()
        } catch let error as CustomError { // 이부분 주목!!!!
            switch error {
            case .firstError:
                print("first")
            case .secondError:
                print("Second")
            }
        } catch {
            print("Unknown")
        }
    }
}

위에 코드를 보시면 하나의 에러를 방출하고 있지만 catch let as 를 통해 어떠한 에러인지
타입캐스팅을 시도하고 있이요! 잠깐...!
그럼 Result 를 통해 해결하면 되죠!

enum CustomError: Error {
    case firstError
    case secondError
}

struct Test {

   typealias ResultType = Result<Void, CustomError>
   
   ...
   
     func callTest2() -> ResultType {
        do {
          try test()
            return .success("Success")
        } catch let error as CustomError{
            return .failure(error)
        } catch {
            return .failure(.unknown)
        }
    }
    
}

자 근본적인 문제는 여전합니다...
결국 하나라도 throws 함수가 있다면 아무리 Result 라고 하더라도
결국에는 do catch 문이 필요해집니다!

Typed throws 적용

자 그럼 뭐가 바뀌었는가? 라는 생각이 드실겁니다.
Typed throws 를 통해 코드를 개선시켜 보겠습니다.

간단... 하죠?
throws 키워드 옆에 CustomError 라고 명시를 하게 된다면..!

위 사진처럼 Error 타입이 확정적으로 CustomError가 된것을 확인하실수 있습니다.

마치며

Swift6 의 타입 던지기! Typed Throws 에 대해서 간단하게 설명해 보았습니다.
위의 참고 문서를 보시게 된다면 왜 해당 키워드를 생성하였는지 설명이 잘 되어있는데요
제가 느끼기에는 이글에 적은 상황이 제일 적합하다고 생각했었습니다!
오늘 하루도 고생 많으셨습니다.!!

profile
IOS 개발자 새싹이
post-custom-banner

0개의 댓글