在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
该代码不会有两个原因:
-
您必须将
dynamic
属性添加到area
属性中,如在使用Cocoa和Objective-C中的Swift中的 “采用Cocoadevise模式”下的“ Key-Value Observing”一节中所述。 -
您必须声明该
area
取决于width
和height
,如“键值观测编程指南 ”中的“注册相关键”所述 。 (这适用于Objective-C和Swift。)为此,您还必须为width
和height
添加dynamic
。(当
width
或height
发生变化时,您可以改为调用willChangeValueForKey
和didChangeValueForKey
,但实现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
现在为width
和height
属性添加willSet { }
和didSet { }
,
里面willSet
为这两个属性添加此self.willChangeValueForKey("area")
并在didSet
添加self.didChangeValueForKey("area");
现在,每当宽度或高度发生变化时,都会通知area
观察员。
注意:这段代码没有经过testing,但我认为它应该做预期的事情