Objective c KVO或如何在Swift中从外部侦听属性更改

Objective c KVO或如何在Swift中从外部侦听属性更改,objective-c,swift,swift2,key-value-observing,Objective C,Swift,Swift2,Key Value Observing,我有一个具有属性的实例,我想侦听来自其他实例的更新 例如,类菜单有一个属性badgeCount,我想监听badgeCount的任何更新,例如当badgeCount更改时。我希望我的ViewController在修改badgeCount以了解实际数据后进行回调 目标是我可以用于列出的属性的KVO,如何在Swift中使用KVO。我是Swift新手。如果您想在Swift中使用KVO,有两个要求: 要对其执行KVO的类必须继承自NSObject(或任何NSObject子类) 您需要观察的属性必须标记为

我有一个具有属性的实例,我想侦听来自其他实例的更新

例如,类菜单有一个属性badgeCount,我想监听badgeCount的任何更新,例如当badgeCount更改时。我希望我的ViewController在修改badgeCount以了解实际数据后进行回调


目标是我可以用于列出的属性的KVO,如何在Swift中使用KVO。我是Swift新手。

如果您想在Swift中使用KVO,有两个要求:

  • 要对其执行KVO的类必须继承自NSObject(或任何NSObject子类)
  • 您需要观察的属性必须标记为
    dynamic
一个代码示例是:

class Menu: NSObject {
  dynamic var badgeCount: Int = 0
}
然后,您可以使用常用的
menuInstance.addObserver(self,forKeyPath:“badgeCount”,选项:NSKeyValueObservingOptions(),上下文:nil)

但这个解决方案不是很快


更好的解决方案包括(不是详尽的列表):

使用swift的
didSet/willSet
调用一些回调函数

class Menu {
  var badgeCount: Int = 0 {
     didSet {
        badgeCountChangedListener(badgeCount)
     }
  }

  init(badgeCountChangedListener: (Int -> Void)) {
    self.badgeCountChangedListener = badgeCountChangedListener
  }

  private let badgeCountChangedListener: (Int -> Void)
}
使用
变量
类型

class Menu {
   let badgeCount = Variable(0)
}

// and from where you observe
menuInstance.badgeCount.subscribeNext { badgeCount in
    print(badgeCount)
}

您也可以使用KVO,但必须使用NSObject等。相反,我建议您使用通知或推出自己的变更观察机制。这两种选择都很好,取决于具体情况,你可能更喜欢其中一种。看看Bond框架,它们有一种可观察的类型可能会帮助你:谢谢,但似乎我不能添加menuInstance.addObserver,甚至没有名为addObserveras的方法,如回答>中所述,您要在其上执行KVO的类必须从NSObject继承