IOS KVC运用代码详解

为什么80%的码农都做不了架构师?>>>   hot3.png

一 KVC简介

KVC,即是指 NSKeyValueCoding,提供一种机制来间接访问对象的属性。常用于字典转模型,或者用于模型转字典继承于NSObject 类,子类可用直接使用。



二 KVC赋值

//可以给当前对象属性赋值
- (void)setValue:(id)value forKey:(NSString *)key;

//可以给对象的属性的属性赋值(推荐使用)
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

//字典转对象
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;


注意:

forKey只能给当前对象属性赋值。

例如:[self setVale:@"wlx" forkey:@"name"]。


forKeyPath 可以给对象的属性的属性赋值。

例如:[self setVale:@"thinkpad" forkeypath:@"person.computer"]。



二 字典转模型

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;

注意:要求字典中的key 和对象属性要求一样



三 模型转字典

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;

//实例:
NSDictionary *dic = [self.dataArray dictionaryWithValuesForKeys:@[@"name",@"age"]];
for (int i =0 ; i



四 KVC取值

//只能获取对象属性的值
- (id)valueForKey:(NSString *)key;

//可以获取对象属性的属性的值(推荐使用)
- (id)valueForKeyPath:(NSString *)keyPath;



五 KVC运算

KVC 可用进行简单的运算,例如 sum avg min 的运算。

[array valueForKeyPath:@"@sum.age"];

NSLog(@"sum=%@",[self.dataArray valueForKeyPath:@"@sum.age"]);
NSLog(@"avg=%@",[self.dataArray valueForKeyPath:@"@avg.age"]);
NSLog(@"min=%@",[self.dataArray valueForKeyPath:@"@min.age"]);



六 注意事项

KVC需要把字符串属性名称转换后才能赋值,调用的set方法,性能消耗较高



七 代码

7.1 ViewController
#import "ViewController.h"
#import "Cat.h"
#import "Person.h"


@interface ViewController ()
@property (nonatomic,strong) NSArray *dataArray;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    /** KVC 测试 **/
    
    //1.KVC 设置Cat 值
    NSLog(@"=====KVC 设置Cat 值  字段转模型====");
    for (int i=0; i


7.2Cat类
===cat.h===
@interface Cat : NSObject

/**
 *  年龄
 */
@property (nonatomic,assign)NSInteger age;

/**
 *  名字
 */
@property (nonatomic,copy)NSString *name;




/**
 *  构造方法
 *
 *  @param dic <#dic description#>
 *
 *  @return <#return value description#>
 */
-(instancetype)initWithDic:(NSDictionary *)dic;

+(instancetype)catWithDic:(NSDictionary *)dic;

@end


===cat.m===

#import 
#import "Cat.h"

@implementation Cat
-(instancetype)initWithDic:(NSDictionary *)dic
{
    if (self = [super init]) {
        
        /** KVC 字典转模型 **/
        //1 通过 setValue 方法
        
        //[self setValue:dic[@"name"] forKey:@"name"];
        //[self setValue:dic[@"age"] forKeyPath:@"age"];

        
        //2 字典转模型
        [self setValuesForKeysWithDictionary:dic];
    }
    return self;
}



+(instancetype)catWithDic:(NSDictionary *)dic
{
    return [[self alloc]initWithDic:dic];
}
@end



7.3 person类
===person.h===
#import "Cat.h"

@interface Person : NSObject


/**
 *  名字
 */
@property (nonatomic,copy)NSString *name;

/**
 *  拥有的猫
 */
@property (nonatomic,strong)Cat *cat;

@end


===person.m===
#import 
#import "Person.h"

@implementation Person
@end


7.4 输出
2014-12-29 00:42:03.814 22KVC测试[2484:149139] =====KVC 设置Cat 值  字段转模型====
2014-12-29 00:42:03.815 22KVC测试[2484:149139] cat1
2014-12-29 00:42:03.815 22KVC测试[2484:149139] cat2
2014-12-29 00:42:03.815 22KVC测试[2484:149139] cat3
2014-12-29 00:42:03.816 22KVC测试[2484:149139] =====forKey forKeyPath valueForKey valueForKeyPath 区别 ====
2014-12-29 00:42:03.816 22KVC测试[2484:149139] 卧龙小 - cat4
2014-12-29 00:42:03.816 22KVC测试[2484:149139] =====模型转字典 ====
2014-12-29 00:42:03.816 22KVC测试[2484:149139] (
    cat1,
    cat2,
    cat3
)
2014-12-29 00:42:03.816 22KVC测试[2484:149139] (
    5,
    7,
    5
)
2014-12-29 00:42:03.816 22KVC测试[2484:149139] =====kvc运算====
2014-12-29 00:42:03.816 22KVC测试[2484:149139] sum=17
2014-12-29 00:42:03.817 22KVC测试[2484:149139] avg=5.6666666666666666666666666666666666666
2014-12-29 00:42:03.817 22KVC测试[2484:149139] min=5


转载于:https://my.oschina.net/wolx/blog/361762

你可能感兴趣的:(IOS KVC运用代码详解)