Swift 3.1: сбой при преобразовании пользовательской ошибки в NSError для доступа к свойству домена

В моем приложении Swift есть настраиваемая система ошибок, где MyError — это просто простой класс, соответствующий Error. Теперь приложение вылетает всякий раз, когда сторонняя библиотека (PromiseKit) пытается преобразовать эту ошибку в NSError, а затем получить доступ к ее свойству domain. В моем собственном коде это работает так, как ожидалось, так почему же происходит сбой в библиотеке и как правильно с этим бороться?

Crashed: com.apple.main-thread
0  libswiftCore.dylib             0x1011d86d8 _hidden#19226_ (__hidden#19178_:1788)
1  libswiftCore.dylib             0x1011cda3c _hidden#19206_ (__hidden#19447_:4045)
2  libswiftCore.dylib             0x1011cda3c _hidden#19206_ (__hidden#19447_:4045)
3  libswiftCore.dylib             0x1011cdc90 swift_getTypeName (__hidden#19406_:1731)
4  AppName                        0x1001dafec specialized (_adHocPrint_unlocked<A, B where ...> (A, Mirror, inout B, isDebugPrint : Bool) -> ()).(printTypeName #1)<A, B where ...> (Any.Type) -> () (MyError.swift)
5  AppName                        0x1001db4f0 specialized specialized _adHocPrint_unlocked<A, B where ...> (A, Mirror, inout B, isDebugPrint : Bool) -> () (MyError.swift)
6  AppName                        0x1001dafb4 specialized _debugPrint_unlocked<A, B where ...> (A, inout B) -> () (MyError.swift)
7  AppName                        0x1001dac00 protocol witness for Error._domain.getter in conformance MyError (MyError.swift)
8  libswiftCore.dylib             0x10104fa14 swift_stdlib_getErrorDomainNSString (__hidden#18979_:140)
9  libswiftCore.dylib             0x1011f96d8 _hidden#21248_ (__hidden#21275_:440)
10 PromiseKit                     0x100dc7d4c Error.isCancelledError.getter (Error.swift:145)

person villapossu    schedule 05.04.2017    source источник
comment
Ваш MyError содержит собственность домена?   -  person Evgeniy Gushchin    schedule 05.04.2017
comment
Неа. В моем собственном коде он, кажется, возвращается к использованию своего имени типа для значения домена.   -  person villapossu    schedule 05.04.2017
comment
взгляните на stackoverflow.com/questions/32981542/ возможно поможет   -  person Evgeniy Gushchin    schedule 05.04.2017
comment
Вы должны принять CustomNSError, см. пример на stackoverflow.com/a/39176551/1187415.   -  person Martin R    schedule 05.04.2017
comment
Вы нашли решение? @виллапоссу   -  person ridvankucuk    schedule 12.04.2017


Ответы (1)


При переходе от Error к NSError он пытается получить доступ к errorCode и errorDomain. Добавление этих расширений исправило мою проблему в том же случае.

extension CustomError: LocalizedError {
    public var errorDescription: String? {
        return "Some localized description"
    }
}

extension CustomError: CustomNSError {
    public static var errorDomain: String {
        return "Some Domain Name"
    }
    public var errorCode: Int {
        return 204 //Should be your custom error code.
    }
}
person ridvankucuk    schedule 12.04.2017
comment
Очевидно, я заставил это работать, реализовав public var _domain и public var _code, но приятно знать, что и для этого есть правильное решение! - person villapossu; 12.04.2017