기존 패턴
보통 error를 반환하기 위해 아래와 같이 enum에 error를 채택하여 사용한다.

이 방식은 간단하고 가독성이 좋지만, 케이스마다 연관값을 추가하다 보면 복잡해진다.
더해서, 상황별로 메타데이터를 표현하기엔 한계가 있다.
Error
Error는 단순히 Sendable을 상속하는 프로토콜이다.
즉, 열거형 뿐 아니라 struct, class도 채택할 수 있어, 상황에 맞게 유연하게 에러를 모델링할 수 있음
protocol Error : Sendable
아래는 메타데이터(line, column)을 포함하는 에러의 예
struct XMLParsingError: Error {
enum Kind {
case invalidCharacter
case mismatchedTag
case internalError
}
let line: Int
let column: Int
let kind: Kind
}
func parse(_ source: String) throws -> XMLDoc {
throw XMLParsingError(line: 19, column: 5, kind: .mismatchedTag)
}
do {
let xmlDoc = try parse(myXMLData)
} catch let e as XMLParsingError {
print("Parsing error: \(e.kind) [\(e.line):\(e.column)]")
} catch {
print("Other error: \(error)")
}
사용 사례
단순히 응답 실패로 표현하는 대신, 어떤 종류의 실패이고, HTTP 상태 코드와 서버에서 받은 실패 응답과 같은 메타데이터를 포함해 정의한 에러
struct APIErrorReason: Error {
enum Kind {
case responseFailed
case responseFailedWithError
case responseFailedWithUnknownReason
}
let kind: Kind
let statusCode: Int
let errorResponse: Decodable?
init(kind: Kind, statusCode: Int, errorResponse: Decodable? = nil) {
self.kind = kind
self.statusCode = statusCode
self.errorResponse = errorResponse
}
}

func fetchUserProfile() async -> Result<User, APIError> {
do {
let (data, response) = try await URLSession.shared.data(for: request)
guard let httpResponse = response as? HTTPURLResponse else {
return .failure(APIError(kind: .network))
}
guard (200..<300).contains(httpResponse.statusCode) else {
return .failure(APIError(kind: .server, statusCode: httpResponse.statusCode, message: "서버 에러 발생"))
}
let user = try JSONDecoder().decode(User.self, from: data)
return .success(user)
} catch {
return .failure(APIError(kind: .decoding, message: error.localizedDescription))
}
}
enum Error vs struct Error
- enum 에러를 사용하는 상황
- 실패 원인을 이름만으로 알 수 있을 때
- 메타 데이터가 필요 없을 때
- 케이스가 적은 단순한 상황
- struct 에러를 사용하는 상황
- 풍부한 메타데이터가 필요할 때
- 여러 곳에서 에러를 재사용할 때
- 여러 추가 정보가 필요할 때
참고
https://developer.apple.com/documentation/swift/error
https://developer.apple.com/documentation/swift/decodingerror
'Swift' 카테고리의 다른 글
| Swift: CORS Error (0) | 2025.11.17 |
|---|---|
| 정렬과 중복 제거가 가능한 모델 (0) | 2025.08.30 |
| Swift: class func, static func, func (0) | 2025.07.20 |
| Swift: print가 값을 출력하는 방법 (1) | 2025.07.13 |
| 주니어 iOS 개발자 Swift 면접 질문 (0) | 2025.04.23 |