在Swift的计算属性上的KVO

只是想知道这是否可能在斯威夫特2.2,KVO上的一个计算属性!?

即:

var width = 0 var height = 0 private var area : Double { get { return with * height } } self.addOberser(self, forKeyPath: "area", ...... 

客户端代码是否会修改with或height触发器observeValueForKeyPath?

在参与市长课堂重构之前进行检查。 KVO的语法和讨厌的一样令人讨厌,如果有人在手边有答案的话,那就算是游乐场也是不值得的(我假设答案是NO)

问候! 〜d

该代码不会有两个原因:

  1. 您必须将dynamic属性添加到area属性中,如在使用Cocoa和Objective-C中的Swift中的 “采用Cocoadevise模式”下的“ Key-Value Observing”一节中所述。

  2. 您必须声明该area取决于widthheight ,如“键值观测编程指南 ”中的“注册相关键”所述 。 (这适用于Objective-C和Swift。)为此,您还必须为widthheight添加dynamic

    (当widthheight发生变化时,您可以改为调用willChangeValueForKeydidChangeValueForKey ,但实现keyPathsForValuesAffectingArea通常更简单。)

从而:

 class MyObject: NSObject { dynamic var width: Double = 0 dynamic var height: Double = 0 dynamic private var area: Double { return width * height } class func keyPathsForValuesAffectingArea() -> Set<String> { return [ "width", "height" ] } func register() { self.addObserver(self, forKeyPath: "area", options: [ .Old, .New ], context: nil) } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { print("observed \(keyPath) \(change)") } } let object = MyObject() object.register() object.width = 20 object.height = 5 

输出:

 observed Optional("area") Optional(["old": 0, "new": 0, "kind": 1]) observed Optional("area") Optional(["old": 0, "new": 100, "kind": 1]) 

正如@Rob在他的回答中所说的那样,要从目标c来观察area dynamic

现在为widthheight属性添加willSet { }didSet { }
里面willSet为这两个属性添加此self.willChangeValueForKey("area")并在didSet添加self.didChangeValueForKey("area");

现在,每当宽度或高度发生变化时,都会通知area观察员。

注意:这段代码没有经过testing,但我认为它应该做预期的事情