Свифт свойства наблюдателя в расширении протокола?

Учтите следующее:

protocol ViewControllable: class {
  typealias VM: ViewModellable
  var vm: VM! { get }
  func bind()
}

extension ViewControllable {
  var vm: VM! {
    didSet {
      bind()
    }
  }
}

Я пытаюсь наблюдать vm собственность и вызов bind всякий раз, когда это вводится. Но это не компилируется с ошибкой, говорящей:

Расширения не могут содержать сохраненные свойства

что имеет смысл, так как протокол не может принудительно заставить свойства stored или же computed,

Возможно ли это сделать без введения class inheritance?

Другими словами, могу ли я наблюдать изменение свойства внутри расширения протокола?

1 ответ

Решение

Нет, это явно запрещено. См. Расширение: вычисляемые свойства:

Расширения могут добавлять новые вычисляемые свойства, но они не могут добавлять сохраненные свойства или добавлять наблюдатели свойств к существующим свойствам.

Имейте в виду, что если бы это было законно, это добавило бы некоторую нетривиальную путаницу в отношении порядка исполнения. Представьте, что было добавлено несколько расширений didSetи фактическая реализация также имела didSet, В каком порядке они должны работать? Это не означает, что это невозможно реализовать, но это может быть несколько удивительно, если у нас это будет.

Другие вопросы по тегам