美文网首页
iOS KVC进阶用法

iOS KVC进阶用法

作者: wp_Demo | 来源:发表于2019-01-10 16:02 被阅读0次
1. KVC字典操作
    TZPerson* p = [TZPerson new];
    
    NSDictionary* dict = @{
                           @"name":@"Tom",
                           @"age":@18,
                           @"nick":@"Cat",
                           @"height":@180,
                           @"dd":@"helo"
                           };
    
    [p setValuesForKeysWithDictionary:dict];
    NSLog(@"p.name = %@, p.age = %d, p.nick =%@, p.height = %f", p.name, p.age, p.nick, p.height);
    
    NSArray* keys = @[@"name", @"age"];
    NSDictionary* dict1 = [p dictionaryWithValuesForKeys:keys];
    
    NSLog(@"%@", dict1);
2. KVC消息传递 array
    NSArray* arr = @[@"Monday", @"Tuesday", @"Wednesday"];
    NSArray* lengthArr = [arr valueForKey:@"length"];
    NSLog(@"%@", lengthArr);
  
    NSArray* lowercaseArr = [arr valueForKey:@"lowercaseString"];
    NSLog(@"%@", lowercaseArr);
3. 聚合操作符 @avg、@count、@max、@min、@sum
    NSMutableArray* students = [NSMutableArray array];
    for (int i = 0; i < 6; i++) {
        TZPerson* student = [TZPerson new];
        NSDictionary* dict = @{
                               @"name":@"Tom",
                               @"age":@(18+i),
                               @"nick":@"Cat",
                               @"height":@(1.65 + 0.02*arc4random_uniform(6)),
                               };
        [student setValuesForKeysWithDictionary:dict];
        [students addObject:student];
    }
    
    NSLog(@"%@", [students valueForKey:@"height"]);
    
    /// 平均身高
    float avg = [[students valueForKeyPath:@"@avg.height"] floatValue];
    NSLog(@"%f", avg);
4. 数组操作符 @distinctUnionOfObjects @unionOfObjects
    NSMutableArray* students = [NSMutableArray array];
    for (int i = 0; i < 6; i++) {
        TZPerson* student = [TZPerson new];
        NSDictionary* dict = @{
                               @"name":@"Tom",
                               @"age":@(18+i),
                               @"nick":@"Cat",
                               @"height":@(1.65 + 0.02*arc4random_uniform(6)),
                               };
        [student setValuesForKeysWithDictionary:dict];
        [students addObject:student];
    }
    
    NSLog(@"%@", [students valueForKey:@"height"]);
    
    //去重
    NSArray* arr = [students valueForKeyPath:@"@distinctUnionOfObjects.height"];
    NSLog(@"arr = %@", arr);
      //不去重
    NSArray* arr1 = [students valueForKeyPath:@"@unionOfObjects.height"];
    NSLog(@"arr1 = %@", arr1);
5. 嵌套数组操作@distinctUnionOfArrays @unionOfArrays
    NSMutableArray* students = [NSMutableArray array];
    for (int i = 0; i < 6; i++) {
        TZPerson* student = [TZPerson new];
        NSDictionary* dict = @{
                               @"name":@"Tom",
                               @"age":@(18+i),
                               @"nick":@"Cat",
                               @"height":@(1.65 + 0.02*arc4random_uniform(6)),
                               };
        [student setValuesForKeysWithDictionary:dict];
        [students addObject:student];
    }
    
    NSMutableArray* students1 = [NSMutableArray array];
    for (int i = 0; i < 6; i++) {
        TZPerson* student = [TZPerson new];
        NSDictionary* dict = @{
                               @"name":@"Tom",
                               @"age":@(18+i),
                               @"nick":@"Cat",
                               @"height":@(1.65 + 0.02*arc4random_uniform(6)),
                               };
        [student setValuesForKeysWithDictionary:dict];
        [students1 addObject:student];
    }
    
    // 嵌套数组
    NSArray* nestArr = @[students, students1];
    
    
    NSArray* arr = [nestArr valueForKeyPath:@"@distinctUnionOfArrays.height"];
    NSLog(@"arr = %@", arr);
    /*
     "1.65",
     "1.71",
     "1.67",
     "1.73",
     "1.75",
     "1.69"
     */
    
    NSArray* arr1 = [nestArr valueForKeyPath:@"@unionOfArrays.height"];
    NSLog(@"arr1 = %@", arr1);
    /*
     "1.73",
     "1.67",
     "1.73",
     "1.71",
     "1.69",
     "1.67",
     "1.75",
     "1.65",
     "1.73",
     "1.73",
     "1.75",
     "1.73"
     */
6. 嵌套集合操作 @distinctUnionOfSets
    NSMutableSet* students = [NSMutableSet set];
    for (int i = 0; i < 6; i++) {
        TZPerson* student = [TZPerson new];
        NSDictionary* dict = @{
                               @"name":@"Tom",
                               @"age":@(18+i),
                               @"nick":@"Cat",
                               @"height":@(1.65 + 0.02*arc4random_uniform(6)),
                               };
        [student setValuesForKeysWithDictionary:dict];
        [students addObject:student];
    }
    
    NSLog(@"students = %@", [students valueForKey:@"height"]);
    /*
     1.69,
     1.75,
     1.71
     */
    NSMutableSet* students1 = [NSMutableSet set];
    for (int i = 0; i < 6; i++) {
        TZPerson* student = [TZPerson new];
        NSDictionary* dict = @{
                               @"name":@"Tom",
                               @"age":@(18+i),
                               @"nick":@"Cat",
                               @"height":@(1.65 + 0.02*arc4random_uniform(6)),
                               };
        [student setValuesForKeysWithDictionary:dict];
        [students1 addObject:student];
    }
    
    NSLog(@"students1 = %@", [students1 valueForKey:@"height"]);
    /*
     1.69,
     1.75,
     1.65,
     1.73,
     1.71
     */
    NSSet* nestSet = [NSSet setWithObjects:students, students1, nil];
    
    NSArray* arr1 = [nestSet valueForKeyPath:@"@distinctUnionOfSets.height"];
    NSLog(@"arr1 = %@", arr1);
    /*
     1.69,
     1.75,
     1.65,
     1.73,
     1.71
     */

KVC集合代理对象:一对多关系,可以通过一个key值映射多个方法或者变量

例一:person中的count属性跟key对应,当获取key的时候会根据count判断:
.h中:

@property (nonatomic, assign) NSUInteger count;

.m中:

- (NSUInteger) countOfBooks {
    return self.count;
}

- (id) objectInBooksAtIndex:(NSUInteger)index {
    return [NSString stringWithFormat:@"book %lu", index];
}
    TZPerson* p = [TZPerson new];
    p.count = 5;
    
    NSLog(@"books = %@", [p valueForKey:@"books"]);
    /*
     books = (
     "book 0",
     "book 1",
     "book 2",
     "book 3",
     "book 4"
     )
     */

例二:key绑定数组:
.h:

@property (nonatomic, strong) NSMutableArray *penArr;

.m:

// 个数
- (NSUInteger) countOfPens {
    return [self.penArr count];
}

// 是否包含这个成员对象
- (id) memberOfPens:(id)object {
    return [self.penArr containsObject:object] ? object : nil;
}

// 迭代器
- (id) enumeratorOfPens {
    return [self.penArr objectEnumerator];
}
    TZPerson* p = [TZPerson new];
    p.penArr = [NSMutableArray arrayWithObjects:@"pen0", @"pen1", @"pen2", @"pen3", nil];
    NSSet* set = [p valueForKey:@"pens"];
    NSLog(@"pens = %@", set);
    /*
     pens = {(
     pen0,
     pen1,
     pen2,
     pen3
     )}
     */

主要注意的是用到了迭代器,我们可以自定义迭代器的便利顺序,例2中我们用的正序,我们也可以使用反序:reverseObjectEnumerator

相关文章

  • iOS KVC进阶用法

    1. KVC字典操作 2. KVC消息传递 array 3. 聚合操作符 @avg、@count、@max、@...

  • KVC原理分析

    iOS中的KVC,我们都熟记于心了,它的用法一般就是 setValue这样的用法 一、KVC之用法 我们在代码里...

  • 说一下KVC和KVO

    本篇采用简单的例子,来介绍 iOS 中的 KVC 和 KVO 的用法和实现原理。 一、KVC 1. KVC是什么 ...

  • iOS Objective-C KVC 的常见用法

    iOS Objective-C KVC 的常见用法 前言 在我们的开发中经常会用到kvc给属性赋值或者取值操作,但...

  • KVC(1) - 进阶用法1

    首先创建一个Person类,在.h文件中定义属性 在ViewController中作如下测试 KVC字典操作 自定...

  • iOS 关于KVC的一些总结(转)

    原文:iOS 关于KVC的一些总结 本文参考: KVC官方文档 KVC原理剖析 iOS KVC详解 KVC 简介 ...

  • iOS知识梳理11:KVC 和KVO

    参考链接:[精辟]KVO 和 KVC 的区别和用法,干货!!!iOS开发技巧系列---详解KVCKVC的优点和缺点...

  • iOS进阶-10 KVC

    在日常发开中,我们可以通过断点调试、源码查看、LLDB调试来探索技术的原理,其实文档查看也是一种极其重要的手段。K...

  • KVC

    iOS 如何使用KVC iOS开发UI篇—Kvc简单介绍 iOS开发系列--Objective-C之KVC、KVO

  • iOS-KVC(一)基本使用

    iOS-KVC(一)基本使用iOS-KVC(二)内部赋值深层次原理iOS-KVC(三)内部取值深层次原理iOS-K...

网友评论

      本文标题:iOS KVC进阶用法

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