Подтвердить что ты не робот

Быстрого наблюдателя свойств в расширении протокола?

Рассмотрим следующее:

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?

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

4b9b3361

Ответ 1

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

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

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