KVC使用场景总结
1.KVC简单赋值(公有、私有属性)
Boy.h
#import <Foundation/Foundation.h>
@interface Boy : NSObject
@property(nonatomic,strong) NSString *name;
@property(nonatomic,assign) NSInteger age;
@property(nonatomic,strong) NSString *city;
- (void)logTest;
@end
Boy.m
#import "Boy.h"
@interface Boy ()
@property(nonatomic,strong) NSString *sport;
@end
@implementation Boy
- (void)logTest{
NSLog(@"sport : %@",self.sport);
}
@end
在 vc 中使用 kvc
- (void)kvcLearn{
Boy *jack = [[Boy alloc] init];
[jack setValue:@"Jack" forKey:@"name"];
[jack setValue:@"18" forKey:@"age"];
[jack setValue:@"football" forKey:@"sport"];
NSLog(@"jack.name : %@",jack.name);
NSLog(@"jack.age : %ld",jack.age);
[jack logTest];
NSLog(@"jack.sport : %@",[jack valueForKey:@"sport"]);
}
可以访问并使用公私有属性。
2.复杂属性赋值
当 Boy 有一个其它类型属性 Book 的属性时候:
Boy *jack = [[Boy alloc] init];
jack.book = [[Book alloc] init];
[jack.book setValue:@"iOS" forKeyPath:@"name"]; //方式一
[jack setValue:@"C++" forKeyPath:@"book.name"]; //方式二
3.添加私有成员变量
[jack setValue:@"182" forKeyPath:@"_height"];
4.字典转模型
NSDictionary *dic = @{@"name":@"book", @"num" : @"66"};
GoodModel *model = [[GoodModel alloc] init];
[model setValuesForKeysWithDictionary:dic];
NSLog(@"model.name : %@",model.name);
NSLog(@"model.num : %@",model.num);
但是,如果 model 属性和 dic 不匹配会怎样?第一种情况,model多一个属性:这样程序没问题,model多出的属性会是nil
第二种情况,model少一个属性:程序会崩溃
第三种情况,model的属性名字和dic的key不匹配 : 程序会崩溃
第二种和第三种崩溃的解决办法是重写方法 -(void)setValue:(id)value forUndefinedKey:(NSString *)key
例如下面:
GoodModel.h
#import <Foundation/Foundation.h>
@interface GoodModel : NSObject
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *num;
@property(nonatomic,copy) NSString *goodId;
@end
GoodModel.m
#import "GoodModel.h"
@implementation GoodModel
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
if([key isEqualToString:@"id"]){
self.goodId = (NSString *)value;
}
}
@end
VC中
NSDictionary *dic = @{@"name":@"book", @"num" : @"66", @"id":@"123"};
GoodModel *model = [[GoodModel alloc] init];
[model setValuesForKeysWithDictionary:dic];
NSLog(@"model.name : %@",model.name);
NSLog(@"model.num : %@",model.num);
NSLog(@"model.goodId : %@",model.goodId);
这样就实现了把 dic 中 id 数据赋值给了 model 中的 goodId。5.模型转字典
NSDictionary *dic = @{@"name":@"book", @"num" : @"66", @"id":@"123"};
GoodModel *model = [[GoodModel alloc] init];
[model setValuesForKeysWithDictionary:dic];
NSDictionary *modelDic = [model dictionaryWithValuesForKeys:@[@"name",@"num",@"goodId"]];
NSLog(@"modelDic : %@", modelDic);