Быстрого наблюдателя свойств в расширении протокола?
Рассмотрим следующее:
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
. В каком порядке они должны работать? Это не означает, что это невозможно реализовать, но это может быть несколько удивительно, если бы мы это сделали.