码迷,mamicode.com
首页 > 其他好文 > 详细

KVC基本使用

时间:2015-08-17 14:09:18      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:


首先,创建两个类,person类和book类。如图:

技术分享技术分享


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

接着代码来将Main.h中

//
//  Created by 胡双飞 on 15/8/15.
//  Copyright (c) 2015年 HSF. All rights reserved.
//

/** (键/值编码)
 *  KVC的基本使用方法:以字符串的形式(关注属性的key)向对象发送消息,查找是否有存在setter
 *                  getter方法,如果不存在,查找_key或key的实例变量,可以设置值。
 *                  同时,通过kvc,也可以获取不存在getter方法的对象值,不需要对象指针
 *                  指向直接访问。(可以设置对象属性的值,也可以获取对象属性的值)
 *  下面的数字和代码中的数字标识的代码例子一致。
 *  1.通过 setValue: forkey: 来设置对象的值(单个设置).如果是int、float、BOOL等基本
 *                          数据类型时,要封装简单可以用 @ 来搞定。
 *  
 *  2.通过 valueForKey:  获取对象的值。
 *
 *  3.通过 valueForKeyPath: 可以通过 英文的点 . 访问到路径指向的值。
 *
 *  4.通过valueForKeyPath:可以访问存储到数组中的每个对象的值,接受时也要用NSArray来接受
 *  
 *  5.通过setValue: forKeyPath: 也可以将访问到路径上的实例对象设值
 *
 *  6.通过dictionaryWithValuesForKeys:(NSArray *)keys  可以通过多个key获取属性值,
 *    并以key-value形式存放到字典中。
 *
 *  7.setValuesForKeysWithDictionary:可以通过字典直接给多个属性设值,常用字典转模型中
 *
 */

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"
//kvc和数组的基本关系
void kvcWithArray();
int main(int argc, const char* argv[])
{
    @autoreleasepool
    {
        //建立一个书类
        Book* book = [[Book alloc] init];
        book.name = @"西游记";
        //建立人
        Person* person = [[Person alloc] init];
        person.name = @"pig";
        person.book = book;

        //person.age = 5;
        //1.当是int,float,BOOL基本数据类型时,要进行封装.
        [person setValue:@5 forKey:@"age"];
        NSLog(@"%zd", person.age);

        //2.通过valueForKey:取值将值从对象解析成NSInterager类型
        NSInteger age = [[person valueForKey:@"age"] integerValue];
        NSLog(@"%ld", age);

        //3.valueForKeyPath基本运算 (方式一)
        NSString* bn = [person valueForKeyPath:@"book.name"];
        NSLog(@"%@", bn);
        //方式二
        [person.book valueForKeyPath:@"name"];
        NSLog(@"%@", person.book.name);

        //4.和数组的关系
        kvcWithArray();

        //5.通过setValue: forKeyPath: 方法来设置值。
        Person* pn = [[Person alloc] init];
        [pn setValue:@"xishi" forKeyPath:@"name"];
        [pn setValue:@"25" forKeyPath:@"age"];
        [pn setValue:@"春秋战国" forKeyPath:@"book.name"];

        //取值
        NSString* nameKeyPath = [pn valueForKeyPath:@"name"];
        NSInteger ageKeyPath = [[pn valueForKeyPath:@"age"] integerValue];
        NSString* bookKeyPath = [person valueForKeyPath:@"book.name"];
        NSLog(@"名字 %@", nameKeyPath);
        NSLog(@"年龄 %zd", ageKeyPath);
        NSLog(@"书名字 %@", bookKeyPath);

        //6.dictionaryWithValuesForKeys: 的使用,可以将数据直接放到字典里。@[ @"name" ,还可以放其他值]
        NSDictionary* dict = [pn dictionaryWithValuesForKeys:@[ @"age", @"name" ]];
        NSLog(@"-------%@", dict);

        //7.setValuesForKeysWithDictionary:可以通过字典直接给多个属性设值。
        Person* vkd = [[Person alloc] init];
        [vkd setValuesForKeysWithDictionary:dict];
        NSLog(@"名字 %@", vkd.name);
        NSLog(@"年龄 %zd", vkd.age);
        NSLog(@"书名字 %@", vkd.book.name);
        /*
         2015-08-17 11:20:42.325 02-KVC[656:33512] 名字 xishi
         2015-08-17 11:20:42.325 02-KVC[656:33512] 年龄 25
         2015-08-17 11:20:42.326 02-KVC[656:33512] 书名字 (null)
         */
        //这里输出结果中书名字为空,原因是我在第六中的字典中没有赋值。
        //(1)用kvc时,可以少值,不能多值,如果多值会出现程序崩溃。
        //(2)在字典转模型时,
        //   在模型类的.m文件,放上-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}
        //   方式来处理,当你的值多时就会来到这个方法,并且可以通过获取多值的属性.
    }
    return 0;
}

void kvcWithArray()
{
    Person* p = [[Person alloc] init];
    p.name = @"tangsen";
    p.age = 30;

    Person* p1 = [[Person alloc] init];
    p1.name = @"sunwukong";
    p1.age = 40;

    Person* p2 = [[Person alloc] init];
    p2.name = @"shaheshag";
    p2.age = 20;

    // 笨的方法将人名添加到数组中。
    //            NSMutableArray *names = [NSMutableArray array];
    //            for (Person *person in persons) {
    //                [names addObject:person.name];
    //            }

    //(1)创建的三个人加到数组中.
    NSArray* persons = @[ p, p1, p2 ];

    // 通过 valueForKeyPath, 取出persons数组中所有person对象的name属性值
    NSArray* names = [persons valueForKeyPath:@"name"];

    NSLog(@"%@", names);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

KVC基本使用

标签:

原文地址:http://blog.csdn.net/hsf_study/article/details/47722985

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!