基本类型的监听 包括String、Int、数组等等
Person
为被监听的对象,name
被监听的属性
class Person: NSObject {
@objc dynamic var name: String
init(name: String) {
self.name = name
}
}
KVO
是基于KVC(Key-Value Coding)
以及动态派发技术实现,所以class
要继承NSObject
,需要监听属性的对象要标记为@objc
dynamic
ViewController
为监听者,需要监听Person
中name
的变化
class ViewController: UIViewController {
var person: Person!
var observation: NSKeyValueObservation?
override func viewDidLoad() {
super.viewDidLoad()
person = Person(name: "name")
observation = person.observe(\Person.name, options: [.new,.old], changeHandler: { (p, change) in
if let name = change.oldValue {
print("旧名字:" + name)
}
if let name = change.newValue {
print("新名字:" + name)
}
})
}
@IBAction func tap(_ sender: UIButton) {
person.name = "shao"
}
}
// 打印结果
旧名字:name
新名字:shao
Enum类型
需要做个转换
class ViewModel: NSObject {
enum AnEnumType : String {
case enumA = "A"
case enumB = "B"
}
// 监听类型为
@objc dynamic private(set) var anEnumRaw : String = ""
var anEnumType : AnEnumType? {
didSet {
anEnumRaw = anEnumType?.rawValue ?? "none"
}
}
}
网友评论