zoukankan      html  css  js  c++  java
  • iOS开发之KVC

    1KVC概述

    KVC(Key-value coding)是一套利用字符串标识符间接访问对象属性和关系的机制。Cocoa Programming中,Core Data,Application Scriptability, 绑定(Binding)技术和声明属性之一语言特性等,都是以KVC为基础的。(Application Scriptability 和 绑定(Binding)是Mac OS X上特有的)。你也可以用Key-value coding来简化你的代码。

    KVC(键-值编码)是一个用于间接访问对象属性的机制,使用该机制不需要调用getset方法就可以设置或获取成员变量的值

    2KVC的基础

    Keys and Key Paths

    KEY:键(Key)是一个标识了对象的某个属性的字符串。通常,在接收对象中,一个键对应的是一个访问方法或者实例变量的名称。Key必须是ASCII编码,以小写字母开头,并且不能包含空白符。

    键的一些示例:payee, openingBalance, transactions, amount等

    Key Path:键路径(Key Path)是一个由多个Key组成,Key与Key之间用点(.)分开的字符串,通过顺序遍历,获取对象属性。键路径中的键序列的第一个键相对于当前的接收对象,而后续的键只与前一个键对应的属性相关。

    例如,对于键路径address.street,其中我们从当前的接收对象中获取address这一属性值,然后再通过这个address的对象属性去获取street属性。

    使用KVC获取属性值:

    方法valueForKey:

    返回特定键对应的值,这个值是与接收对象相关的。如果输入的键没有对应的方法或者实例变量,接收对象会发出valueForUndefinedKey: 消息。方法valueForUndefinedKey:默认会抛出NSUndefinedKeyException异常,可以在子类中改写。

    方法valueForKeyPath:

    与之类似,返回特定键路径在对应接收对象中的值。当键路径的键序列中有任何一个键无法对应兼容KVC的对象,则接收对象都会发出valueForUndefinedKey: 消息。

    方法dictionaryWithValuesForKeys:

    对输入的键数组中的每一个键进行检索,返回包含了这些键对应的值的NSDictionary。

    【备注】集合对象(Collection Object),如NSArray, NSSet, NSDictionary等不能包含nil值。可以使用NSNull来替代nil放入集合对象中标识空值。NSNull提供一个简单的实例来表示对象属性的nil值。在方法 dictionaryWithValuesForKeys: 和 setValuesForKeysWithDictionary: 中,NSNull和nil之间的转换是自动的,所以你的对象不用明确测试NSNull值。

    使用KVC设置属性值:

    方法setValue:forKey:

    给特定的键设值,这个值相对于对应的接收对象或者是已经提供的值。

    方法setValuesForKeysWithDictionary:

    可以从字典映射到对象,不需要再给一一给对象来赋值。使用NSDictionary来给一组键设值。该方法内部调用setValue:forKey:给每一组键值对设值。想存入空值时,使用NSNull取代nil。 该方法常用于字典转模型中,比如:

    - (instancetype)initWithDict:(NSDictionary *)dict

    {

        if (self = [super init]) {

            self.icon = dict[@"icon"];

            self.title = dict[@"title"];

            self.answer = dict[@"answer"];

            self.options = dict[@"options"];

        }

        return self;

    }

    + (instancetype)questionWithDict:(NSDictionary *)dict

    {

        return [[self alloc] initWithDict:dict];

    }

    可以用KVC写成:

    + (instancetype) questionWithDict:(NSDictionary *)dict

    {

        return [[self alloc] initWithDict:dict];

    }

    - (instancetype)initWithDict:(NSDictionary *)dict

    {

        if (self = [super init]) {

            [self setValuesForKeysWithDictionary:dict];

        }

        return self;

    }

  • 相关阅读:
    snmp简介
    PKI简介
    小程序收藏
    mysql数据库中同一DB内倒表指令
    核心层+汇聚层+接入层
    eng
    rmon简介
    几个常用的JavaScript字符串处理函数
    C# 特性(Attribute)学习 关于 .net中[]的解释
    C#操作Excel文件(读取Excel,写入Excel)
  • 原文地址:https://www.cnblogs.com/lifengfneg/p/4773830.html
Copyright © 2011-2022 走看看