맛동산이

Swift) Error type에 대해서 본문

앱/Swift

Swift) Error type에 대해서

진ddang 2024. 8. 25. 20:38

swift concurrency와 result에 대해서 사용을 하려고 하다보니 Error타입에 대해서 계속해서 등장을하는데 한번도 제대로 공부해본적이 없는것 같아서 정리해보려고 한다.

Error

스위프트에서 Error는 Error라는 프로토콜을 준수하는 값 타입으로 표현된다.

Error는 빈 프로토콜이라서 Error를 던져주기 위해서는 Error를 그냥 쓰면 안되고 enum으로 Error를 정의해서 던져줘야 제대로된 Error를 채택하는 에러를 ㅋㅋ( 말이 웃기네 ㅋㅋㄹㅋㅋ) 던져준다.

그냥 간단하게 Error자체로는 못씀.

enum으로 Error를 정의해줘야 사용가능

Error 타입 정의

enum NetworkError: Error {
    case 종류1
    case 종류2
    case 종류3
    //...
}

이렇게 enum을 통해서 에러를 생성하고, 이를 던져주면된다.

혹은 message를 던져주거나 전달해주려고 한다면 다음과같이

enum 오류종류이름: Error {
    case commonError(String)
    case 종류2
    case 종류3
    //...
}

commonError를 던져주고 받을때 case let으로 String값을 전달해주는 방식으로 처리해도 된다.

정의된 에러를 사용하기

private func asnycThrows() async throws -> Result<Model?, NetworkError> {}

이런 함수라면 Result에서 Model을 던져줄수도, 에러가 발생했을때 NetworkError타입을 던져줄수도 있다.

이때 에러를 던져준다면

Result.success(Model())
Result.failure(.commonError(message))

이렇게 성공시 Model을 실패시 NetworkError.commonError(String)을 넘겨줄수 있게 된다.

에러타입을 정의하고 싶다면? ( 에러 케이스가 아닌.)

에러타입을 직접적으로 생성할수도 있다.

동일하게 Error를 채택하고있는 class나 struct 로도 에러를 생성할수 있다.

방법은 간단하다.

protocol ErrorType {
	var source: String?
	....
}

struct APIError: Error, ErrorType, Equtable {
	var source: String?
	...
}

이렇게 직접 만들어서 decoding 시점에서 Error로 던져주거나 혹은 async await이라면 catch 시점에서 error를 생성해서 뿌려주면 될듯 하다.

반응형