KVC:
全称Key-Value Code,是一种间接访问对象的方式。类似于Java中的反射。
使用KVC需要该类继承与NSObject。获取被访问对象值的方法是:value(forKey:)
, 设置被访问对象的方法是:setValue(, forKey: )
。其中value(forKey:)
这个方法或得到的是任意值,需要我们手动转型。
class Person: NSObject {
var name: String = ""
var age: Int = 0
}
import UIKit
class KVOViewController: BaseViewController {
var object = Person()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
object.name = "Jack"
object.age = 18
let name = object.value(forKey: "name") as! String
print("------> FORWARD NAME:\(name)")
object.setValue("Bob", forKey: "name")
let nameNew = object.value(forKey: "name") as! String
print("------> NOW NAME:\(nameNew)")
}
}
KVO:
KVO的全称是Key-Value Observer,属于观察者模式。就是说当一个值发生改变时,其之前注册的观察者能自动获取到它的变化(变化前的值与变化后的值)。使用KVO的前提是该类要继承于NSObject,且属性不能被初始化(必须要提前赋值,不能为optional类型,前缀必须为@objc dynamic
),使用前要注册,使用过程中监听,使用后销毁。
class Person: NSObject {
@objc dynamic var name: String = ""
@objc dynamic var age: Int = 0
}
import UIKit
class KVOViewController: BaseViewController {
var object = Person()
private var objectContext: Int = 1100
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
object.addObserver(self, forKeyPath: "name", options: NSKeyValueObservingOptions.new, context: &objectContext)
object.name = "Jack"
}
deinit {
object.removeObserver(self, forKeyPath: "name", context: &objectContext)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if context == &objectContext {
print("------> VALUE:\(change?[NSKeyValueChangeKey.newKey])")
}
}
}