В данный момент я хочу попытаться понять, как работает протокол ошибок для перечислений. Это может случиться с любым разработчиком, который сделал нормальную архитектуру с ошибками запроса / ответа для логгера или чего-то еще.
Это просто на детской площадке:
enum SomeError: String, Error {
case myCustomError = "Printed Custom Error"
}
func prepareForSomething(sender: Any?) {
if sender is Error {
print ("is Error")
}
if let error = sender as? Error {
doWithSomethingError(error)
}
}
func doWithSomethingError(_ error: Error) {
if let error = error as? SomeError {
print (error.rawValue)
}
}
prepareForSomething(sender: SomeError.myCustomError)
Результат:
is Error
Printed Custom Error
В этом случае мы получили ожидаемый результат
но когда мы попробуем еще один пример, мы получим неожиданный результат
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
performSegue(withIdentifier: "SomeSegue", sender: SomeError.myCustomError)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "SomeSegue" {
if sender is SomeError {
print ("is SomeError")
}
if sender is Error {
print ("is Error")
}
}
}
}
Результат:
is SomeError
Как видите, тип Any?
может быть преобразован в присвоенный тип перечисления с протоколом ошибок, но не в исходный протокол ошибок.
Итак, вопрос в том, почему переданная переменная для типа Any?
не работает с переопределенной функцией prepare(for segue: UIStoryboardSegue, sender: Any?)
Каждый день мы можем использовать эту функцию и нам нужно передать некоторые данные.
UPDATE:
Я только что попытался создать другой класс и переопределить функцию с аналогичным типом Any?
, но он работает нормально.
Я признаю, что это ошибка, но где я должен сообщить об этом, я не знаю.
Может быть, я ошибался, но в лицо это должно сработать.