본문 바로가기
Swift

struct Error vs. enum Error

by songmoro 2025. 8. 18.

 

기존 패턴

보통 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