Swift 4的KVO(Key Value Observation)用法

KVO 是 Objective-C 对观察者模式的实现。当被观察对象的某个属性发生更改时,观察者对象会获得通知。

KVO实现依赖于Objective-C的Runtime,所以Swift需要使用@objc暴露api给Objective C。

Swift目前没有内置原生实现的值观察系统,Swift 4的KVO使用dynamic属性来实现。

被观察的类

class Person: NSObject {
    let name: String
    @objc dynamic var age: Int

}

Person类的age就KVO属性。被观察的类需要满足以下几点:

1、类需要继承与NSObject,非NSObject子类不支持KVO
2、被观察属性需要为dynamic属性
3、被观察的属性需要使用@objc声明,这是因为Swift 4不再自动给NSObject的子类添加@objec。如果整个类的属性都需要被观察,可以使用@objcMembers

注册观察

let person= Person(name: "Jack", age: 5)

let observation =  person.observe(\.age) { (p, change) in
  print("initial \(p.age)")
}

如果需要观察新旧值得变化,可以使用options

let observation =  person.observe(\.age, options: [.initial, .old, .new, .prior]) { (p, change) in
  print("initial \(p.age)")
  print("old \(p.oldValue)")
  print("new \(p.newValue)")
  print("is p \(p.isPrior)")
}

这里使用Swift 4新增的Key Path语法:\.age,它是Person.age的简写方式。

版权声明:著作权归作者所有。

相关推荐

Swift 3/4缩放UIImage的方法

给UIImage添加extension(兼容Swift3 和Swift 4)extension UIImage {     func scaled(withSize size: CGSize) -> UIImage {   &nbs

Swift 4:KeyPath

Swift 4对KeyPath做了很大的改进。改进后的为类型安全的KeyPath。Swift 2的KeyPath示例class Person: NSObject {   var name: String = ""   init(name: 

Swift 4 Codable协议 - 基本用法

Swift 4新增了Codable协议,它是一个组合协议,包含Encodable和Decodable两个协议。代码定义如下:/// A type that can convert itself into and out of an external repre

使用Swift 3/Swift 4扫描二维码

iOS的AVFoundation内置了对二维码和条形码扫描的支持。使用AVFoundation扫描二维码的功能需要几件事:创建AVCaptureSession,用于捕获二维码创建预览捕获二维码成功后,委派回调来处理二维码的meta信息下面的例子是基于UIViewController开发的扫描二维码Controller,使用AVCaptureMetadataOutputObjectsDelegate

Swift3/Swift4 转换Html为纯文本

Swift 3或者Swift 4 添加String扩展,把Html字符串转换为纯文本Xcode 9 beta • Swift 4extension String {     var html2AttributedString: NSAttr

[译]Swift 4字符串的更新

又一年过去了,Swift String API又做了一些更改。Swift 4对String带来了一些很需要的改进以及简化。这些是我写的笔记,它记录了我的Swift字符串小抄关于Swift4需要做的改动。你可以在这里找到原来的和现在更新的指南以及Xcode playground:Swift String Cheat SheetXc