Dav*_*mes 5 key-value-observing foundation ios swift computed-properties
只是想知道这是否可能在Swift 2.2,KVO中计算属性!?
即:
var width = 0
var height = 0
private var area : Double {
get {
return with * height
}
}
self.addOberser(self, forKeyPath: "area", ......
Run Code Online (Sandbox Code Playgroud)
客户端代码是否会修改with或height触发器observeValueForKeyPath?
只需在参与市长类重构之前进行检查.KVO的语法很烦人,因为如果有人手头有答案,我甚至不值得去操场(我假设答案是否定的)
问候!〜d
rob*_*off 14
该代码不起作用有两个原因:
您必须将dynamic属性添加到area属性中,如使用Swift with Cocoa和Objective-C中的 "采用Cocoa设计模式"下的"键值观察"部分所述.
您必须声明这area取决于width并且height如"键值观察编程指南 "中的"注册从属键"中所述.(这适用于Objective-C和Swift.)为此,您还必须添加dynamic到width和height.
(你可以改为调用willChangeValueForKey,didChangeValueForKey无论何时width或height改变,但通常更容易实现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
Run Code Online (Sandbox Code Playgroud)
输出:
observed Optional("area") Optional(["old": 0, "new": 0, "kind": 1])
observed Optional("area") Optional(["old": 0, "new": 100, "kind": 1])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3065 次 |
| 最近记录: |