zoukankan      html  css  js  c++  java
  • KVC示例

    KVC –key value Coding,可以让我们通过键值编码的形式进行属性值的赋值

    参考苹果官网的图。。

    1.KVC

    定义一个Person类

    .h文件

       1:  #import <Foundation/Foundation.h>
       2:  
       3:  @interface Person : NSObject
       4:  {
       5:     NSString *name;
       6:  }
       7:   
       8:  @end

    .m文件

       1:  #import "Person.h"
       2:   
       3:  @implementation Person
       4:   
       5:  @end

    通过普通的获取属性的方法是无法对name进行赋值和取值操作的,这种情况可以通过KVC来进行设置和取值

       1:  - (void)viewDidLoad {
       2:      [super viewDidLoad];
       3:      // Do any additional setup after loading the view, typically from a nib.
       4:     Person  person=[[Person alloc]init];
       5:      [person setValue:@"keith" forKey:@"name"];
       6:      NSLog(@"name is %@",[person valueForKey:@"name"]);
       7:  }
    输出:
    2014-11-26 21:51:12.237 KVCtest[543:10453] name is keith

    赋值用setValue:forKey:

    取值用 valueForKey:

    2.键路径

    如果类中包含其他的类怎么办呢,访问这个类的属性怎么办呢。可以使用setValue: forKeyPath: 和valueForKeyPath设置和获取

    如定义一个car

    .h文件

    #import <Foundation/Foundation.h>
    
    @interface Car : NSObject
    {
        NSString *carname;
    }
    @end

    将Person的.h改成

    #import <Foundation/Foundation.h>
    @class Car;
    @interface Person : NSObject
    {
        NSString *name;
        Car *hiscar;
    }
    -(id)init;
    @end

    .m为

    #import "Person.h"
    #import "Car.h"
    @implementation Person
    -(id)init{
        if (self=[super init]) {
            hiscar=[[Car alloc]init];
        }
        return self;
    }
    @end

    这里实现了car的实例化,如果不这么做在键值编程时候hiscar因为没有初始化而出现无法赋值的情况

    调用:

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        Person *person=[[Person alloc]init];
        [person setValue:@"keith" forKey:@"name"];
    
        [person setValue:@"QQ" forKeyPath:@"hiscar.carname"];
        NSLog(@"name is %@,hiscar is %@",[person valueForKey:@"name"],[person valueForKeyPath:@"hiscar.carname"]);
        
        /*或者这样*/
         Car *car=[[Car alloc]init];
         [car setValue:@"BeiKy" forKey:@"carname"];
         [person setValue:car forKey:@"hiscar"];
        NSLog(@"name is %@,hiscar is %@",[person valueForKey:@"name"],[person valueForKeyPath:@"hiscar.carname"]);
    
    }
    输出结果

    2014-11-26 22:45:47.392 KVCtest[1031:25564] name is keith,hiscar is QQ
    2014-11-26 22:45:47.394 KVCtest[1031:25564] name is keith,hiscar is BeiKy

    
    

    3.类型封装和转换

    再次修改Person.h文件

    #import <Foundation/Foundation.h>
    @class Car;
    @interface Person : NSObject
    {
        NSString *name;
        Car *hiscar;
        NSInteger age;//增加一个年龄类型是NSInteger
    }
    -(id)init;
    @end
     

    那么如何在设置的时候会发生什么呢?

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        Person *person=[[Person alloc]init];
        [person setValue:@"keith" forKey:@"name"];
        [person setValue:@"QQ" forKeyPath:@"hiscar.carname"];
        [person setValue:@"24" forKeyPath:@"age"];//为年龄赋值
        NSLog(@"name is %@, is %@ old ,hiscar is %@",[person valueForKey:@"name"],[person valueForKey:@"age"],[person valueForKeyPath:@"hiscar.carname"]);
    
    }

    结果是:

    2014-11-26 22:56:08.873 KVCtest[1086:27956] name is keith, is 24 old ,hiscar is QQ

    4.操作集合

    在Person中添加一个otherPerson

    #import <Foundation/Foundation.h>
    @class Car;
    @interface Person : NSObject
    {
        NSString *name;
        Car *hiscar;
        NSInteger age;
        NSMutableArray *otherPerson;
    }
    -(id)init;
    @end

    属性.@sum.属性,还有@count,@avg,@max.@min

    -(void)kvcCollection{
        Person *person=[[Person alloc]init];
        [person setValue:@"keith" forKey:@"name"];
        Person *person1=[[Person alloc]init];
        Person *person2=[[Person alloc]init];
        Person *person3=[[Person alloc]init];
        Person *person4=[[Person alloc]init];
        NSMutableArray *others=[[NSMutableArray alloc]initWithObjects:person1,person2,person3,person4, nil];
        NSInteger agenum=20;
        for (Person *p in others) {
            [self setage:p age:[[NSString alloc]initWithFormat:@"%ld",agenum++]];
        }
        [person setValue:others forKey:@"otherPerson"];
        NSLog(@"other's age is %@",[person valueForKeyPath:@"otherPerson.age"]);
        NSLog(@"the avg age is %@",[person valueForKeyPath:@"otherPerson.@avg.age"]);
        NSLog(@"the sum age is %@",[person valueForKeyPath:@"otherPerson.@sum.age"]);
        NSLog(@"the count person is %@",[person valueForKeyPath:@"otherPerson.@count.age"]);
        NSLog(@"the min age is %@",[person valueForKeyPath:@"otherPerson.@min.age"]);
        NSLog(@"the max age is %@",[person valueForKeyPath:@"otherPerson.@max.age"]);
        
    }
    -(void)setage:(Person *)person age:(NSString *)age{
        [person setValue: age forKey:@"age"];
    }

    输出

    2014-11-26 23:51:00.180 KVCtest[1346:42300] other's age is (
        20,
        21,
        22,
        23
    )
    2014-11-26 23:51:00.183 KVCtest[1346:42300] the avg age is 21.5
    2014-11-26 23:51:00.183 KVCtest[1346:42300] the sum age is 86
    2014-11-26 23:51:00.184 KVCtest[1346:42300] the count person is 4
    2014-11-26 23:51:00.184 KVCtest[1346:42300] the min age is 20
    2014-11-26 23:51:00.184 KVCtest[1346:42300] the max age is 23

     

    本文参考 容芳志博客,感谢这位博友

    著作权声明:本文由http://www.cnblogs.com/keithmoring/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

  • 相关阅读:
    Linux与Windows命令的比较
    操作系统的启动过程
    Spyder快捷键
    pytoch的最佳打开方式
    操作系统逻辑结构
    插值法
    bzoj3509[CodeChef]COUNTARI
    bzoj2969 矩形粉刷
    hdu5575 Discover Water Tank
    bzoj3473字符串&bzoj3277串
  • 原文地址:https://www.cnblogs.com/keithmoring/p/4125002.html
Copyright © 2011-2022 走看看