2016-11-30 2 views
4

У меня есть следующий класс, определенный на детской площадке с Swift 3:Почему ошибка всегда была NSError?

class MyError: Error { 

} 

Затем я создаю экземпляр этого класса и проверить, если это NSError

let firstError = MyError() 
firstError is NSError // Output: false 

Выход, как и ожидалось , и я также получаю предупреждение, которое указывает Cast from 'MyError' to unrelated type 'NSError' always fails. Это имеет полный смысл для меня, но если я изменить код немного и объявить переменную как Error, я получаю странный результат:

var secondError: Error 
secondError = MyError() 
secondError is NSError // Output: true 

И в этом случае я получаю предупреждение в последней строке, говорит 'is' test is always true. Я не понимаю, почему Error всегда будет NSError, когда модель определена в обратном направлении (NSError: Error). Любая идея, что здесь происходит?

+0

Я думаю, что это связано: http://stackoverflow.com/questions/39033194/anyobject-not-working-in-xcode8-beta6 – courteouselk

+1

Потому что компилятор способен принуждать 'Error' к' NSError'. Быстрый поиск в Swift repo нашел это: https://github.com/apple/swift/blob/2fe4254cb712fa101a220f95b6ade8f99f43dc74/stdlib/public/core/ErrorType.swift#L174 –

ответ

0

Это намеренное поведение, позволяющее типам Swift Error взаимодействовать с Objective-C.

Компилятор только сделает принуждение, когда преодоление Swift ошибок в Objective-C, или в случае, когда все у вас есть это Error экзистенциальные, который может содержать что-нибудь ... помните, что это может так же хорошо, пришли из throws функция, записанная в Objective-C. Это также дает вам возможность получить принуждение, если вам нужно передать NSError непосредственно в какой-то метод Objective-C в качестве параметра (по какой-либо причине).

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