键值编码(KVC)-处理不存在的key和处理nil值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HUXU981598436/article/details/42364193

//

//  main.m

//  处理不存在的key和处理nil

//

//  Created by Goddog on 15/1/3.

//  Copyright (c) 2015 Goddog. All rights reserved.

//

/*

 1.处理不存在的key:(1)如果操作属性时即没有对应的settergetter方法,也不存在对应的成员变量。

                 (2)KVC自动调用setValue:forUndefinedKey:valueForUndefinedKey: 方法。

                 (3)通过重新方法处理机制即可。

 2.处理nil值:(1)如果属性基本类型是(intfloatdouble)且传入对应的参数,如果设置一个nil,就异常。

             (2)KVC自动调用setNilValueForKey方法实现

             (3)通过重新方法处理机制即可。

 */


#import <Foundation/Foundation.h>

//接口部分
@interface Item : NSObject
//使用@property 定义两个成员变量
@property (nonatomic,copy) NSString* name;
@property (nonatomic,assign) int price;
@end

//实现部分
@implementation Item

//重写setValue:forUndefinedKey:方法,处理不存在的key赋值问题
-(void) setValue:(id)value forUndefinedKey:(NSString *)key
{
    NSLog(@"您尝试设置的key: %@ 不存在",key);
    NSLog(@"您尝试设置的value: %@",value);
}

//重写valueForUndefinedKey:方法,处理不存在的key获值问题
//-(void) valueForUndefinedKey: (id)key
//{
//    NSLog(@"您尝试访问的key:%@并不存在",key);
//}

//重写setNilValueForKey方法来处理设置nil问题
-(void) setNilValueForKey:(NSString *)key
{
    //如果设置为空的话就处理
    if([key isEqualToString:@"price"])
    {
        //设置为0
        _price = 0;
    }
    else
    {
        //回调默认的方法
        [super setNilValueForKey:key];
    }
}

@end

//测试部分
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //创建对象
        Item* item = [[Item alloc] init];
        
        //无key
        [item setValue:@"时间" forUndefinedKey:@"time"];
        //[item valueForKey:@"time"];
        
        //设nil
        [item setValue:nil forKey:@"name"];
        [item setValue:nil forKey:@"price"];
        NSLog(@"名字是:%@, 价格是:%@",[item valueForKey:@"name"],[item valueForKey:@"price"]);
    }
    return 0;
}


阅读更多
换一批

没有更多推荐了,返回首页