KVC
2018-10-13 本文已影响15人
mtry
基础使用
关于valueForKey:
取值规则
- 先找相关
get
方法,如果找不到 - 那么去判断
+ (BOOL)accessInstanceVariablesDirectly
是否返回YES- 如果返回NO,直接执行
valueForUndefinedKey:
抛出异常 - 如果返回YES,再继续找相关变量
- 如果返回NO,直接执行
为了方便假设我们使用[obj valueForKey:@"name"]
相关get方法
-
- (NSString *)getName
,没有则下一步 -
- (NSString *)name
,没有则一步 - 集合类的相关方法判断,比如数组
- (NSInteger)countOfName
和- (id)objectInNameAtIndex:(NSInteger)index
相关变量
-
_name
,没有则下一步 -
_isName
,没有则下一步 -
name
,没有则下一步 -
isName
,还没有,要报错了
关于setValue:forKey:
设置规则
顺序和valueForKey:
一样,不过方法有些不一样
- 先找相关
set
方法,如果找不到 - 那么去判断
+ (BOOL)accessInstanceVariablesDirectly
是否返回YES- 如果返回NO,直接执行
setValue:forUndefinedKey:
抛出异常 - 如果返回YES,再继续找相关变量
- 如果返回NO,直接执行
相关set方法
-
- (void)setName:(NSString *)name
,没有则下一步 -
- (void)setIsName:(NSString *)isName
,还没有,要报错了
集合类特殊用法
例如:count
、min
、max
、sum
、avg
使用方法keypathToCollection.@collectionOperator.keypathToProperty
@interface KVCObject : NSObject
@property (nonatomic, assign) NSInteger number;
@end
@implementation KVCObject
@end
- (void)viewDidLoad
{
[super viewDidLoad];
KVCObject *obj1 = [[KVCObject alloc] init];
KVCObject *obj2 = [[KVCObject alloc] init];
KVCObject *obj3 = [[KVCObject alloc] init];
obj1.number = 20;
obj2.number = 10;
obj3.number = 30;
NSMutableArray *array = [NSMutableArray array];
[array addObject:obj1];
[array addObject:obj2];
[array addObject:obj3];
NSLog(@"%@", [array valueForKey:@"@count"]);
NSLog(@"%@", [array valueForKeyPath:@"@min.number"]);
NSLog(@"%@", [array valueForKeyPath:@"@max.number"]);
NSLog(@"%@", [array valueForKeyPath:@"@sum.number"]);
NSLog(@"%@", [array valueForKeyPath:@"@avg.number"]);
NSLog(@"%@", [array valueForKeyPath:@"number"])
}
打印
NSLog(@"%@", [array valueForKey:@"@count"]) -> 3
NSLog(@"%@", [array valueForKeyPath:@"@min.number"]) -> 10
NSLog(@"%@", [array valueForKeyPath:@"@max.number"]) -> 30
NSLog(@"%@", [array valueForKeyPath:@"@sum.number"]) -> 60
NSLog(@"%@", [array valueForKeyPath:@"@avg.number"]) -> 20
NSLog(@"%@", [array valueForKeyPath:@"number"]) -> (
20,
10,
30
)