KVO与KVC使用

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])")
        }
        
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值