IOS KVC 활용 코드 상세 설명

6242 단어 iosKVC

KVC 소개


KVC, 즉 NSKeyValueCoding은 간접적으로 객체에 액세스할 수 있는 메커니즘을 제공합니다.사전 모델 변환 또는 모델 사전 변환에 자주 사용되며 NSObject 클래스에서 상속되며 하위 클래스는 직접 사용할 수 있습니다.

2 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"].

2 사전 회전 모형

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

주의: 사전의 키와 대상 속성이 같아야 합니다

삼모형

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

// :
NSDictionary *dic = [self.dataArray dictionaryWithValuesForKeys:@[@"name",@"age"]];
for (int i =0 ; i<dic.count; i++) {
    NSLog(@"%@", [dic objectForKey:[dic allKeys][i]]);
}

4 KVC 값

// 
- (id)valueForKey:(NSString *)key;

// ( )
- (id)valueForKeyPath:(NSString *)keyPath;

5KVC 연산


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 코드


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<self.dataArray.count; i++) {
        Cat *cat = (Cat *)self.dataArray[i];
        NSLog(@"%@",cat.name);
    }
    
    
    
    //2   forKey forKeyPath  
    NSLog(@"=====forKey forKeyPath valueForKey valueForKeyPath   ====");
    //2.1   person  
    Person *p = [[Person alloc]init];
    //2.2   cat  
    Cat *cat = self.dataArray[0];
    //2.3   cat   persion   cat  
    p.cat = cat;
    
    //2.4   person name  
    [p setValue:@" " forKey:@"name"];
    
    //2.5   persion cat   name  
    //[p setValue:[cat name] forKey:@"cat.name"]; // NSUnknownKeyException
    [p setValue:@"cat4" forKeyPath:@"cat.name"];
    
    NSLog(@"%@ - %@",[p valueForKey:@"name"],[p valueForKeyPath:@"cat.name"]);
    
    
    
    
    //3  
    NSLog(@"=====  ====");
    NSDictionary *dic = [self.dataArray dictionaryWithValuesForKeys:@[@"name",@"age"]];
    for (int i =0 ; i<dic.count; i++) {
        NSLog(@"%@", [dic objectForKey:[dic allKeys][i]]);
    }
    
    
    //4 kvc 
    NSLog(@"=====kvc ====");
    NSLog(@"sum=%@",[self.dataArray valueForKeyPath:@"@sum.age"]);
    NSLog(@"avg=%@",[self.dataArray valueForKeyPath:@"@avg.age"]);
    NSLog(@"min=%@",[self.dataArray valueForKeyPath:@"@min.age"]);
}

/**
 *   
 */
-(NSArray *)dataArray
{
    
    //    1. 
    NSBundle *bundle = [NSBundle mainBundle];
    NSArray *array = [NSArray arrayWithContentsOfFile:[bundle pathForResource:@"cat.plist" ofType:nil]];
    
    NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:array.count];
    
    //    2. 
    for (NSDictionary *dic in array) {
        Cat *cat = [Cat catWithDic:dic];
        [mutableArray addObject:cat];
    }
    
    //    3. 
    _dataArray = mutableArray;
    return _dataArray;
}
@end

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 <Foundation/Foundation.h>
#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.h===
#import "Cat.h"

@interface Person : NSObject


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

/**
 *   
 */
@property (nonatomic,strong)Cat *cat;

@end


===person.m===
#import <Foundation/Foundation.h>
#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

좋은 웹페이지 즐겨찾기