У меня есть следующий класс, определенный на детской площадке с 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
). Любая идея, что здесь происходит?
Я думаю, что это связано: http://stackoverflow.com/questions/39033194/anyobject-not-working-in-xcode8-beta6 – courteouselk
Потому что компилятор способен принуждать 'Error' к' NSError'. Быстрый поиск в Swift repo нашел это: https://github.com/apple/swift/blob/2fe4254cb712fa101a220f95b6ade8f99f43dc74/stdlib/public/core/ErrorType.swift#L174 –