Downcast enum с протоколом ошибок из любого типа в Swift 4 - PullRequest
0 голосов
/ 28 июня 2018

В данный момент я хочу попытаться понять, как работает протокол ошибок для перечислений. Это может случиться с любым разработчиком, который сделал нормальную архитектуру с ошибками запроса / ответа для логгера или чего-то еще.

Это просто на детской площадке:

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?, но он работает нормально.

Я признаю, что это ошибка, но где я должен сообщить об этом, я не знаю. Может быть, я ошибался, но в лицо это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...