2016-01-14 1 views
0

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

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

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 с использованием протоколов или что-то еще?

ответ

2

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

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

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

... 
CustomError(error) 

Смотрите также Does Swift support implicit conversion?

Смежные вопросы