[TIL] LocalizedError

hzw94·2022년 5월 12일
0

TIL

목록 보기
1/2

LocalizedError Protocol

Swift의 Error 관련 프로토콜 LocalizedError 에 대해 알아봅시다.

What is LocalizedError


말 그대로를 번역하면 오류와 오류가 발생한 이유에 대한 Localized된 메세지를 제공하는 Specialized한 error 에 대한 내용을 담고있습니다.
또한, 기본적으로 Error 를 상속하고 있는 상태의 프로토콜입니다.

  • 에러를 처리하는데에 쓰이는 유용한 프로토콜입니다.

Today I Learned

enum StringInputError: Error {
    case nilName
    case emptyName
}

extension StringInputError: LocalizedError {
    public var errorDescription: String? {
        switch self {
        case .nilName:
            return "잘못된 접근입니다."
        case .emptyName:
            return "이름을 입력해주세요. 빈칸은 안됩니다."
        }
    }
}

프로토콜 채택과정과, 프로퍼티 내용을 적어가는 것에 대해서는 위의 코드와 같이 간단하게 사용 할 수 있습니다.
그러나 여기서 봐야 할 것이, errorDescription: String? 이라고 써져있는 부분인데
이 프로퍼티는 정확하게 String의 Optional 값을 반환하고 있습니다.

그래서 다음과 같이 코드를 사용하면

    func isValidStringInput(inputResult: Result<String, StringInputError>,
                            guestName: inout String) -> Bool {
        switch inputResult {
        case .success(let name):
            guestName = name
            return true
        case .failure(let namingError):
            print(namingError.errorDescription)            
            return false
        }
    }

이런식으로 error를 담는 property에 errorDescription을 출력하게 될 경우 옵셔널 값을 출력하게 됩니다.

코드를 짜면서, 저 optional 만들어 주지 않기 위해서 굳이 localizedError프로토콜을 사용하지 않고, errorDescription 프로퍼티만 가져와서 optional을 뺀 연산 프로퍼티를 사용하면 되지 않을까? 싶었는데.. 답은 전부 내장 프로퍼티에 있었습니다.

다음과 같이 코드를 구현하면 optional이 아닌 값을 바로 획득할수 있더라구요... ㅎㅎ

    func isValidStringInput(inputResult: Result<String, StringInputError>,
                            guestName: inout String) -> Bool {
        switch inputResult {
        case .success(let name):
            guestName = name
            return true
        case .failure(let namingError):
            print(namingError.localizedDescription)
            return false
        }
    }

바뀐게 무엇인지 보이시나요?
namingError.errorDescription에서 namingError.localizedDescription 으로 변경되었습니다!

localizedDescription은 사실 LocalizedError Protocol의 프로퍼티는 아닙니다.

Definition을 찾아가 보면 Error의 Extension에 쓰여져있는데요

내부 구조는 조금 더 파 봐야 자세히 알겠지만, 오늘 이것으로 에러 처리 할때 에러에 대한 내용을 간단하게 정해놓고 획득할수 있는 구조를 생각해볼수 있게 되었습니다.

profile
볼가놈의 iOS & Swift & RxSwift & PS 저장창고

0개의 댓글