KVC学习

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值