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