Error(Type)

  • 파일명은 ErrorType.swift로 되어있지만, protocol 은 Error로 되어있다.

Swift <-> NSError

  • 레퍼런스나 interop 가이드를 봐도 swift의 error를 NSError로 변환시 code, domain, userInfo부분을 어떻게 하면 되는지 나오지 않는다. enum SomeError: Error로 구현한 경우 NSError로 변환시 Error Domain=__lldb_expr_1.SomeError Code=1 "(null)"의 형태로 출력된다. 나쁠건 없지만, 그래도 좀 더 읽기 편한게 좋을거 같다.
  • ErrorType.swift의 소스를 보면 아래와 같다.
public protocol Error {
    var _domain: String { get } // 1.
    var _code: Int { get } // 2.
    ...
    var _userInfo: AnyObject? { get } // 3.
}

그냥 봐도 바로 이 부분이 NSError의 domain, code, userInfo인것 같다.

  1. _domain은 에러 도메인이다. 난 com.facebook.post 같은 형식으로 하긴 하지만 강요하지 않는다. 구현은 아래와 같다.
enum SomeError: Error {
    ...
    var _domain: String {
        return "com.facebook.post"
    }
    ...
}
  1. _code는 에러 코드이다. 구현은 아래와 같다.
enum SomeError: Error {
    ...
    var _code: Int {
        switch self {
        case ...: return 1
        case ...: return 2
        ...
        }
    }
    ...
}
  1. _userDomain은 NSDictionary를 반환한다. [Key: Value]이거 아니다. NSDictionary다. _userDomain의 타입이 Any(타입)가 아니라 AnyObject(오브젝트)라서 그렇다. 구현은 다음과 같다. 아니 나는 보통 이렇게 한다.
enum SomeError: Error {
    ...
    var _userInfo: AnyObject? {
        return Mirror(reflecting: self).children.reduce([String: Any]()) {
            var info = $0
            if let label = $1.label {
                info[label] = $1.value
            }
            return info
        }
    }
    ...
}

이렇게 구현하게 되면 NSError로 변환시 code, domain, userInfo가 구현된다.

어따 쓸지는 모르겠지만, 필요할 때가 있겠지.