zoukankan      html  css  js  c++  java
  • iOS开发-OC篇-KVC详解

      说到KVC,不得不承认KVC在开发过程中是神器一般的存在。如果正确灵活使用kvc,会使得整个开发过程轻松很多。

    KVC的使用

    1、KVC 全称 key valued coding 键值编码

    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性.JAVA,C#都有这个机制。ObjC也有,所以你根部不必进行任何操作就可以进行属性的动态读写,就是KVC。

    KVC的操作方法由NSKeyValueCoding提供,而他是NSObject的类别,也就是说ObjC中几乎所有的对象都支持KVC操作。

    2、常用方法

    获取值的方法

    valueForKey:,传入NSString属性的名字。

    valueForKeyPath:,传入NSString属性的路径,xx.xx形式。

    valueForUndefinedKey它的默认实现是抛出异常,可以重写这个函数做错误处理。

    修改值的方法

    setValue:forKey:

    setValue:forKeyPath:

    setValue:forUndefinedKey:

     setValue:forKey的搜索过程:

    1. 首先搜索set<Key>:方法

    如果成员用@property,@synthsize处理,因为@synthsize告诉编译器自动生成set<Key>:格式的setter方法,所以这种情况下会直接搜索到。

    注意:这里的<Key>是指成员名,而且首字母大写。

    2. 上面的setter方法没有找到,如果类方法accessInstanceVariablesDirectly返回YES(注:这是NSKeyValueCodingCatogery中实现的类方法,默认实现为返回YES)。

    那么按_<key>,_is<Key>,<key>,is<key>的顺序搜索成员名。

    3. 如果还是没有找到设置成员的值,就会调用setValue:forUndefinedKey:。

    4. 如果没有重写setValue:forUndefinedKey程序会马上崩溃。

    注意:

    1、使用KVC间接修改对象属性时,系统会自动判断对象属性的类型,并完成转换。.

    2、KVC可以访问成员变量,无论是否提供getter/setter方法,无论可见性是怎样,是否有readonly修饰。

    setValue:forUndefinedKey与valueForUndefinedKey的应用

    KVC的主要用途无非是ORM映射,就是将dictionary转换成model,但有些服务器返回的字段有可能是oc的关键字比如‘id’,’description’等。如上代码举得id的例子,我们无法让@property后面key值为id,于是使用大写的ID代替,KVC是区分大小写的我们不用担心。这时我们只需在setValue:forUndefinedKey把id的key值赋值给ID的key值,就可以避免关键字的尴尬。

     3、dict <->model 互转

    字典转模型

    [self setValuesForKeysWithDictionary:dict];

    模型转字典

    [p dictionaryWithValuesForKeys:array];

    4、KVC集合

    NSArray/NSSet等都支持KVC

    [array valueForKeyPath:@"dog.name"];

    5、使用KVC计算属性

    格式为:[p valueForKeyPath:@"Left keypath部分.@Collectionoperator部分.Right keypath部分”];

    Left keypath部分:需要操作对象路径。

    Collectionoperator部分:通过@符号确定使用的集合操作。

    Right keypath部分:需要进行集合操作的属性。

    举例:[p valueForKeyPath:@"books.@sum.price"];

    @avg:平均值

    @count:总数

    @max:最大

    @min:最小

    @sum:总数

        

  • 相关阅读:
    IDEA插件备忘录
    SpringBoot2基础笔记
    EasyCode模板,配合通用mapper,dubbo项目使用
    七牛云存储
    Apache POI
    SSM项目中关于配置的一二三
    SSM整合笔记
    Spring5学习笔记
    ThinkPHP框架,按分类,计算商品价格区间,来完成价格搜索
    PHP常用符号和函数
  • 原文地址:https://www.cnblogs.com/Horkly/p/5331228.html
Copyright © 2011-2022 走看看