Можно ли настроить неявное преобразование из NSError в пользовательскую ошибку в Swift?

Прочитав следующее из NSHipster, я задумался о NSError и о том, можно ли что-то настроить, чтобы NSError неявно преобразуется в пользовательский тип ошибки.

Я создал следующее:

protocol NSErrorConvertible {

    init(error: NSError)
} 

и это

struct CustomError: NSErrorConvertible {
    var message: String
    var code: String?

    init(error: NSError) {
        code = String(error.code)
        message = error.localizedDescription
    }   
}

Однако я не вижу ничего, что могло бы привести к неявному преобразованию.

Я знаю, что такая функция существует в C++ с конструктором с одним аргументом. Есть ли что-то подобное в Swift с использованием протоколов или чего-то еще?


person finneycanhelp    schedule 14.01.2016    source источник


Ответы (1)


Нет. Swift обычно избегает неявных преобразований. Они даже убрали инструменты, которые мы использовали для его реализации (__conversion), потому что это создает много головной боли, как для компилятора, так и для внедрения незаметных ошибок. Очень часто неявное преобразование вносит небольшие различия, которые имеют значение. Часто важно, чтобы программист учитывал эти вещи и не прибегал к магии. Это был давний источник ошибок в C и C++.

Если вы добавите _ перед error (поэтому метка не требуется), то явное преобразование будет тривиальным:

init(_ error: NSError) { ... }

...
CustomError(error)

См. также Поддерживает ли Swift неявное преобразование?

person Rob Napier    schedule 14.01.2016