KVC键值编码基本调用包括 -valueForkey:和-setValue:forKey: 已字符串的形式向对象发送消息。
#import <Foundation/Foundation.h>
@interface Book:NSObject
@property (copy)NSString *name;
@property float price;
@end
#import "Book.h"
@implementation Book
@synthesize name;
@synthesize price;
-(NSString *)description
{
NSString *desc;
desc = [NSString stringWithFormat:@"book name:%@ price:%.2f",name,price];
return desc;
}
@end
#import <Foundation/Foundation.h>
@class Book;
@interface Person :NSObject
{
Book * book;
NSArray *books;
NSMutableDictionary*stuff;
}
@property (copy)NSString *name;
@property int age;
@end
#import "Person.h"
@implementation Person
@synthesize name;
@synthesize age;
//处理nil值
-(void)setNilValueForKey:(NSString *)key
{
if([key isEqualToString:@"age"])
{
self.age = 0;
}else{
[super setNilValueForKey:key];
}
}
//处理未定义的键值
-(void) setVaule:(id) value forUndefinedKey:(NSString *)key
{
if(stuff == nil)
{
stuff = [[NSMutableDictionary alloc] init];
}
[stuff setValue:value forKey:key];
}
-(id)vauleForUndefinedKey:(NSString *) key
{
id value = [stuff valueForKey:key];
return value;
}
-(void)dealloc
{
[stuff release];
[super dealloc];
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *person = [[Person alloc] init];
//通过KVC设置初始值
[person setValue:@"jack" forKey:@"name"];
[person setValue:[NSNumber numberWithInt:25] forKey:@"age"];
//通过KVC访问
NSLog(@"person name is %@",[person valueForKey:@"name"]);
NSLog(@"person age is %@",[person valueForKey:@"age"]);
//路径访问
Book*book = [[Book alloc] init];
[person setValue:book forKey:@"book"];
[person setValue:@"iphone deveploer" forKeyPath:@"book.name"];
NSLog(@"name:%@",[person valueForKeyPath:@"book.name"]);
//一对多
NSMutableArray *books = [[NSMutableArray alloc] init];
for( int i = 0;i < 3;i++){
Book*book = [[Book alloc] init];
[book setValue:[NSString stringWithFormat:@"book_%d",i] forKey:@"name"];
[book setValue:[NSNumber numberWithFloat:(35.6 +i)] forKey:@"price"];
[books addObject:book];
[book release];
}
[person setValue:books forKey:@"books"];
NSLog(@"%@",books);
NSArray * nameArray = [person valueForKeyPath:@"books.name"];
NSLog(@"%@",nameArray);
//流畅的运算 sum min max avg count
NSNumber *count = [person valueForKeyPath:@"books.@count"];
NSNumber *priceTotal = [person valueForKeyPath:@"books.@sum.price"];
NSLog(@"person have %@ books",count);
NSLog(@"boos price %.2f",[priceTotal floatValue]);
}
return 0;
}