KVC

作者: mtry | 来源:发表于2018-10-13 15:55 被阅读15次

    基础使用

    关于valueForKey:取值规则

    • 先找相关get方法,如果找不到
    • 那么去判断+ (BOOL)accessInstanceVariablesDirectly是否返回YES
      • 如果返回NO,直接执行valueForUndefinedKey:抛出异常
      • 如果返回YES,再继续找相关变量

    为了方便假设我们使用[obj valueForKey:@"name"]

    相关get方法

    1. - (NSString *)getName,没有则下一步
    2. - (NSString *)name,没有则一步
    3. 集合类的相关方法判断,比如数组 - (NSInteger)countOfName- (id)objectInNameAtIndex:(NSInteger)index

    相关变量

    1. _name,没有则下一步
    2. _isName,没有则下一步
    3. name,没有则下一步
    4. isName,还没有,要报错了

    关于setValue:forKey: 设置规则

    顺序和valueForKey:一样,不过方法有些不一样

    • 先找相关set方法,如果找不到
    • 那么去判断+ (BOOL)accessInstanceVariablesDirectly是否返回YES
      • 如果返回NO,直接执行setValue:forUndefinedKey:抛出异常
      • 如果返回YES,再继续找相关变量

    相关set方法

    1. - (void)setName:(NSString *)name,没有则下一步
    2. - (void)setIsName:(NSString *)isName,还没有,要报错了

    集合类特殊用法

    例如:countminmaxsumavg

    使用方法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
    )
    
    

    相关文章

      网友评论

          本文标题:KVC

          本文链接:https://www.haomeiwen.com/subject/fdboaftx.html