免费开源的iOS开发学习平台

KVC介绍:1 - 使用KVC进行赋值取值

KVC简介

KVC(Key-value coding)即键值编码,对应了NSKeyValueCoding类。NSKeyValueCoding类是对NSObject类进行的扩展,因此所有的类都可以使用NSKeyValueCoding类中定义的方法。其最基本的使用就是可以对对象属性进行赋值和取值,可以起到和点语法同样的效果。

在KVC中针对对象属性的赋值和取值提供了如下几种常用的方法。

  • 赋值方法
- (void)setValue:(nullable id)value forKey:(NSString *)key; //简易路径赋值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath; //复合路径赋值
  • 取值方法
- (nullable id)valueForKey:(NSString *)key;  //简易路径取值
- (nullable id)valueForKeyPath:(NSString *)keyPath;  //复合路径取值

示例代码

为了学习KVC的用法,我们预先定义两个类Person类和Dog类,其中Person类中有一个dog属性,如下所示。

  • Person.h
#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
@property (nonatomic, copy) NSString *personName;
@property (nonatomic, strong) Dog *dog;
@end
  • Dog.h
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@property (nonatomic, copy) NSString *dogName;
@property (nonatomic, copy) NSNumber *dogAge;
@end

下方的示例代码综合使用了KVC中有关赋值/取值的方法。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person = [[Person alloc] init];
        Dog *dog = [[Dog alloc] init];
        //使用KVC设值
        [dog setValue:@"tom" forKey:@"dogName"];
        [person setValue:@"shixin" forKey:@"personName"];
        [person setValue:dog forKey:@"dog"];
        [person setValue:@2 forKeyPath:@"dog.dogAge"];
        //使用KVC取值
        NSString *personName = [person valueForKey:@"personName"];
        NSString *dogName = [person valueForKeyPath:@"dog.dogName"];
        NSNumber *dogAge = [person valueForKeyPath:@"dog.dogAge"];
        NSLog(@"<%@>的宠物狗名叫<%@>, 它<%@>岁了.",personName,dogName,dogAge);
    }
    return 0;
}

运行结果:

示例代码

https://github.com/99ios/5.4.1