IOS KVC 활용 코드 상세 설명
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.