Swift 中计算属性上的 KVO 可行吗?
var width = 0
var height = 0
private var area : Double {
get {
return with * height
}
}
self.addOberser(self, forKeyPath: "area", ......
修改 with 或 height 的客户端代码会触发observeValueForKeyPath吗?
只是在进行市长类重构之前检查一下。 KVO 的语法很烦人,如果有人手头有答案的话,它甚至不值得在游乐场上使用。 (我假设答案是否定的)
该代码不起作用有两个原因:
您必须添加dynamic
归因于area
属性,如“键值观察”部分所述“采用可可设计模式”将 Swift 与 Cocoa 和 Objective-C 结合使用 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-ID6.
-
您必须声明area
依赖于取决于width
and height
如中所述中的“注册从属密钥”键值观察编程指南 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVODependentKeys.html。 (这适用于 Objective-C 和 Swift。)为此,您还必须添加dynamic
to width
and height
.
(你可以改为调用willChangeValueForKey
and didChangeValueForKey
每当width
or height
改变,但通常更容易实施keyPathsForValuesAffectingArea
.)
Thus:
import Foundation
class MyObject: NSObject {
@objc dynamic var width: Double = 0
@objc dynamic var height: Double = 0
@objc dynamic private var area: Double {
return width * height
}
@objc class func keyPathsForValuesAffectingArea() -> Set<String> {
return [ "width", "height" ]
}
func register() {
self.addObserver(self, forKeyPath: "area", options: [ .old, .new ], context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("observed \(keyPath) \(change)")
}
}
let object = MyObject()
object.register()
object.width = 20
object.height = 5
Output:
observed Optional("area") Optional([__C.NSKeyValueChangeKey(_rawValue: new): 0, __C.NSKeyValueChangeKey(_rawValue: kind): 1, __C.NSKeyValueChangeKey(_rawValue: old): 0])
observed Optional("area") Optional([__C.NSKeyValueChangeKey(_rawValue: new): 100, __C.NSKeyValueChangeKey(_rawValue: kind): 1, __C.NSKeyValueChangeKey(_rawValue: old): 0])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)