Протоколы со связанными типами в Swift 4.2 - PullRequest
0 голосов
/ 08 октября 2018

У меня есть вопрос о протоколах со связанными типами, которые произошли после обновления до Xcode 10 и Swift 4.2.

До того, как у меня был протокол:

protocol ViewModelBased: class {
    associatedtype ViewModel
    var viewModel: ViewModel { get set }
}

и VC, реализующий его.

class MyViewController: UIViewController, ViewModelBased {
    var viewModel: EntitiesViewModel!
}

После обновления до Xcode 10 я получаю сообщение об ошибке, в котором говорится, что MyViewController не соответствует протоколу, и я должен объявить свойство следующим образом:

var viewModel: ViewModel! { get set }

У кого-либо есть идеипочему есть разница, как я не понимаю?

1 Ответ

0 голосов
/ 08 октября 2018

По сути, ваш код всегда был сомнительным, и теперь вас поймали:

protocol ViewModelBased: class {
    associatedtype ViewModel
    var viewModel: ViewModel { get set }
}
class MyViewController: UIViewController, ViewModelBased {
    var viewModel: EntitiesViewModel!
}

В адаптере протокола MyViewController какой тип, по вашему мнению, соответствует ViewModel?Кажется, вы думаете, что это должен быть EntitiesViewModel.И компилятор позволил этому скользить, позволив неявно развернутому опциональному переносу типа заменить его на сам тип.

Но теперь не существует неявно развернутого необязательного типа;тип EntitiesViewModel! фактически совпадает с типом EntitiesViewModel?, необязательной оберткой EntitiesViewModel.Поэтому, если вы хотите, чтобы EntitiesViewModel был ViewModel, и если вы хотите, чтобы тип этого свойства был необязательным переносом EntitiesViewModel, протокол должен объявить тип этого свойства в качестве необязательного переноса ViewModel.

...