KVO对Swift的计算属性

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

该代码不起作用有两个原因:

  1. 您必须将dynamic属性添加到area属性中,如使用Swift with Cocoa和Objective-C中的 "采用Cocoa设计模式"下的"键值观察"部分所述.

  2. 您必须声明这area取决于width并且height"键值观察编程指南 "中的"注册从属键"中所述.(这适用于Objective-C和Swift.)为此,您还必须添加dynamicwidthheight.

    (你可以改为调用willChangeValueForKey,didChangeValueForKey无论何时widthheight改变,但通常更容易实现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)

  • 通常,出于几个原因使用"上下文"是一个好主意,但这个答案并不是关于KVO的那部分.另外,如果你只从`NSObject`继承,除非你想要,否则你不需要使用`context`,因为`NSObject`没有注册任何KVO通知,因此不可能与你的超类冲突. (2认同)