OC KVC总结

  在iOS开发中,我们一般使用set方法或者点语法来修改对象的属性值,比如说 stu.age = 9 与 [stu setAge:9]。

  KVC(key value coding)键值编码,这是一种间接修改对象属性值的方法。实现方法就是通过用字符串来描述要修改的属性。基本的操作方法有 setValue:forKey: 和 valueForKey,以字符串的形式发送对象

  特别提醒,使用KVC中所有的value都必须是对象。

      在此以Student类和 Book类作为例子来总结

  Student类:

 1 //.h文件
 2 #import <Foundation/Foundation.h>
 3 @class Book;
 4 @interface Student : NSObject
 5 
 6 @property (nonatomic, assign) int age;
 7 
 8 @property (nonatomic, copy) NSString* name;
 9 
10 
11 @property (nonatomic, strong) Book* book;
12 
13 @property (nonatomic, strong) NSArray* books;
14 @end
15 
16 //.m文件
17 
18 #import "Student.h"
19 #import "Book.h"
20 @implementation Student
21 
22 
23 - (NSString *) description
24 {
25     return  [NSString stringWithFormat:@"%@ %d", _name, _age];
26 }
27 @end

  Book类:

  

 1 //.h文件
 2 #import <Foundation/Foundation.h>
 3 
 4 @interface Book : NSObject
 5 
 6 
 7 @property (nonatomic, assign) int price;
 8 @end
 9 
10 //.m文件
11 #import "Book.h"
12 
13 @implementation Book
14 
15 @end

  主函数:

  

  1 #import <Foundation/Foundation.h>
  2 #import "Student.h"
  3 #import "Book.h"
  4 
  5 
  6 //1.设值 取值
  7 void fun1()
  8 {
  9     NSLog(@"==============fun1==============");
 10     Student *stu = [[Student alloc] init];
 11     
 12     [stu setValue:@"hehe" forKey:@"name"];
 13     [stu setValue:@10 forKey:@"age"];
 14     
 15     NSLog(@"%@", stu);
 16     
 17     NSLog(@"name : %@", [stu valueForKey:@"name"]);
 18 }
 19 
 20 //2.批量获取属性值
 21 void fun2()
 22 {
 23     NSLog(@"==============fun2==============");
 24     Student *stu = [[Student alloc] init];
 25     
 26     [stu setValue:@"hehe" forKey:@"name"];
 27     [stu setValue:@10 forKey:@"age"];
 28     
 29     NSArray *arr = @[@"name", @"age"];
 30     
 31     NSDictionary  *dict = [stu dictionaryWithValuesForKeys:arr];
 32     
 33     NSLog(@"%@", dict);
 34 }
 35 
 36 //3.批量设置属性值(通过字典批量赋值)
 37 void fun3()
 38 {
 39     NSLog(@"==============fun3==============");
 40     Student *stu = [[Student alloc] init];
 41     
 42     NSDictionary *dict = @{@"age": @12, @"name" : @"悟空"};
 43     
 44     [stu setValuesForKeysWithDictionary:dict];
 45     
 46     NSLog(@"%@", stu);
 47 }
 48 
 49 
 50 //4.通过键路径(key path)访问(使用valueForKeyPath)
 51 void fun4()
 52 {
 53     NSLog(@"==============fun4==============");
 54     Student *stu = [[Student alloc] init];
 55     Book *book = [[Book alloc] init];
 56     stu.book = book;
 57     //设置值
 58     [stu setValue:@12 forKeyPath:@"book.price"];
 59     //获取值
 60     NSNumber *price = [stu valueForKeyPath:@"book.price"];
 61     
 62     NSLog(@"price: %@", price);
 63 }
 64 
 65 //5.对数组进行整体操作
 66 void fun5()
 67 {
 68     NSLog(@"==============fun5==============");
 69     Student *stu = [[Student alloc] init];
 70     
 71     Book *book = [[Book alloc] init];
 72     book.price = 12;
 73     Book *book1 = [[Book alloc] init];
 74     book1.price = 10;
 75     Book *book2 = [[Book alloc] init];
 76     book2.price = 12;
 77     
 78     NSArray *arr = @[book, book1, book2];
 79     
 80     stu.books = arr;
 81     //获取值
 82 //    NSArray *prices = [stu valueForKeyPath:@"books.price"];
 83     NSArray *prices = [stu.books valueForKeyPath:@"price"];
 84     NSLog(@"prices: %@", prices);
 85 }
 86 
 87 //6.键路径的运算符(数组元素求和)
 88 void fun6()
 89 {
 90     NSLog(@"==============fun6==============");
 91     Student *stu = [[Student alloc] init];
 92     
 93     Book *book = [[Book alloc] init];
 94     book.price = 12;
 95     Book *book1 = [[Book alloc] init];
 96     book1.price = 10;
 97     Book *book2 = [[Book alloc] init];
 98     book2.price = 12;
 99     
100     NSArray *arr = @[book, book1, book2];
101     
102     stu.books = arr;
103     //获取值
104     NSNumber *sum = [stu valueForKeyPath:@"books.@sum.price"];
105     NSLog(@"prices: %@", sum);
106 }
107 
108 //7.键路径的运算符(数组总数count)
109 void fun7()
110 {
111     NSLog(@"==============fun7==============");
112     Student *stu = [[Student alloc] init];
113     
114     Book *book = [[Book alloc] init];
115     book.price = 12;
116     Book *book1 = [[Book alloc] init];
117     book1.price = 10;
118     Book *book2 = [[Book alloc] init];
119     book2.price = 12;
120     
121     NSArray *arr = @[book, book1, book2];
122     
123     stu.books = arr;
124     //获取值
125     NSNumber *sum = [stu valueForKeyPath:@"books.@count.price"];
126     NSLog(@"num: %@", sum);
127 }
128 
129 //8.键路径的运算符(获取数组不同元素)
130 void fun8()
131 {
132     NSLog(@"==============fun8==============");
133     Student *stu = [[Student alloc] init];
134     
135     Book *book = [[Book alloc] init];
136     book.price = 12;
137     Book *book1 = [[Book alloc] init];
138     book1.price = 10;
139     Book *book2 = [[Book alloc] init];
140     book2.price = 12;
141     
142     NSArray *arr = @[book, book1, book2];
143     
144     stu.books = arr;
145     //获取值
146     NSArray *array = [stu valueForKeyPath:@"books.@distinctUnionOfObjects.price"];
147     NSLog(@"array: %@", array);
148 }
149 
150 //9.求数组元素中得最大值、最小值、平均值
151 void fun9()
152 {
153     NSLog(@"==============fun9==============");
154     Student *stu = [[Student alloc] init];
155     
156     Book *book = [[Book alloc] init];
157     book.price = 12;
158     Book *book1 = [[Book alloc] init];
159     book1.price = 10;
160     Book *book2 = [[Book alloc] init];
161     book2.price = 12;
162     
163     NSArray *arr = @[book, book1, book2];
164     
165     stu.books = arr;
166     //获取值
167     NSNumber *max = [stu valueForKeyPath:@"books.@max.price"];
168     NSNumber *min = [stu valueForKeyPath:@"books.@min.price"];
169     NSNumber *average = [stu valueForKeyPath:@"books.@avg.price"];
170     NSLog(@"max: %@", max);
171     NSLog(@"min: %@", min);
172     NSLog(@"avg: %@", average);
173 }
174 
175 
176 int main(int argc, const char * argv[])
177 {
178 
179     @autoreleasepool {
180         fun1();
181         fun2();
182         fun3();
183         fun4();
184         fun5();
185         fun6();
186         fun7();
187         fun8();
188         fun9();
189     }
190     return 0;
191 }

 

 

  

posted @ 2014-10-28 09:34  pretty guy  阅读(1072)  评论(2编辑  收藏  举报