Использование переменной ViewController в segue.destination - PullRequest
0 голосов
/ 11 июня 2018

В приведенном ниже коде я пытаюсь использовать переменную controller, чтобы заполнить тип моей цели назначения внизу.Но вместо этого я получаю сообщение об ошибке, в котором говорится, что controller не объявлено.Это объявлено прямо там на второй линии!Я вижу это!Я понимаю, что есть много альтернатив использованию идентификаторов segue, но мне больше интересно узнать, почему это не работает.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    var controller: UIViewController

    switch segue.identifier {
    case "ASegue":
        controller = AViewController()
    case "BSegue":
        controller = BViewController()
    case "CSegue":
        controller = CViewController()
    default:
        controller = AViewController()
    }

    if let vc = segue.destination as? controller { //Use of undeclared type 'controller'
        ...
    }
}

1 Ответ

0 голосов
/ 11 июня 2018

Приведение должно быть к типу (буквальный), а не к переменной .

И в любом случае вы не можете объединить все свои действия в один *Переменная 1007 *, как вы, кажется, хотите, именно потому, что они являются различными типами.

Таким образом, вы просто переместите приведение в каждый случай переключателя, приведя к типу, который вырассчитывать на контроллер назначения этого сегмента и выполнять соответствующую работу над , controller в , case:

switch segue.identifier {
case "ASegue":
    if let controller = segue.destination as? AViewController {
        // do stuff
    }
case "BSegue":
    if let controller = segue.destination as? BViewController {
// etc.

Возможно, немного более чистый способ выразить эточтобы забыть идентификатор и просто перейти к классу контроллера вида, , если , то каждый возможный переход имеет свой класс контроллера вида:

switch segue.destination {
case let controller as AViewController:
    // populate controller
case let controller as BViewController:
    // populate controller
// etc.
...