Swift의 Error 관련 프로토콜 LocalizedError 에 대해 알아봅시다.
말 그대로를 번역하면 오류와 오류가 발생한 이유에 대한 Localized된 메세지를 제공하는 Specialized한 error 에 대한 내용을 담고있습니다.
또한, 기본적으로 Error 를 상속하고 있는 상태의 프로토콜입니다.
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에 쓰여져있는데요
내부 구조는 조금 더 파 봐야 자세히 알겠지만, 오늘 이것으로 에러 처리 할때 에러에 대한 내용을 간단하게 정해놓고 획득할수 있는 구조를 생각해볼수 있게 되었습니다.