协议扩展中的Swift属性观察者?

协议扩展中的Swift属性观察者?,swift,swift2,protocol-extension,Swift,Swift2,Protocol Extension,考虑以下几点: protocol ViewControllable: class { typealias VM: ViewModellable var vm: VM! { get } func bind() } extension ViewControllable { var vm: VM! { didSet { bind() } } } 我试图观察vm属性,并在注入时调用bind。但编译时不会出现如下错误: 扩展不能包含存储的属性 这是有意义

考虑以下几点:

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

extension ViewControllable {
  var vm: VM! {
    didSet {
      bind()
    }
  }
}
我试图观察
vm
属性,并在注入时调用
bind
。但编译时不会出现如下错误:

扩展不能包含存储的属性

这是有意义的,因为协议不能强制属性
存储
计算

这是否可以在不引入类继承的情况下实现


换句话说,我可以观察协议扩展内部属性的更改吗?否,这是明确不允许的。见:

扩展可以添加新的计算属性,但不能添加存储属性,也不能向现有属性添加属性观察员


请记住,如果这是合法的,它会增加一些关于执行顺序的不寻常的混乱。假设有几个扩展添加了
didSet
,而实际的实现也有一个
didSet
。它们应该按什么顺序运行?这并不意味着它不可能实现,但如果我们有了它,可能会有些意外。

感谢您的澄清。但是,对于它可能带来的混乱,我不敢苟同。许多其他编程语言处理这类菱形问题,要么通过编译错误使其显式化,要么根据声明的顺序进行推断。例如,Scala在发生冲突时,优先考虑在类中扩展后声明的
特征(
协议(
协议)
)(
)>“它们应该以什么顺序运行?”真的吗?我自然想拥有这个功能。你有了一个新客户。你唯一关心的信息是他的唯一标识符。您可以设置标识符。设置这个标识符后,协议方法就可以获取我们需要的关于客户的所有信息。以正确的顺序执行代码并不难,我希望代码能够处理其余的部分,而不必关心手动调用所有函数。现在,使用协议和扩展而不感到心痛是一件很不舒服的事情:(@Ferologics和其他-如果你愿意使用关联属性,你确实可以这样做。请参阅我在问题下的评论。请注意,如果你使用关联属性,你确实可以很容易地做到这一点。我最近发布了一篇关于如何创建关联属性的帖子:这在撰写本文时非常新鲜,所以希望它是非常稳定。关于这个问题,你可以使用的一个完美例子是这个QA中使用的例子:@Fattie你能修复那个链接吗?我目前无法查看你的帖子或示例。啊,你是说第一个链接!注意,所以关闭了“文档”功能。不幸的是,这个示例已经永远消失了。对不起!我想是这样的: