iOS KVC常用操作符及应用

其实,KVC对我来说已经很熟悉了,不得不承认,它的确是cocoa的大招,然而在使用过程中有些操作符还是经常免不了度娘,因此整理下这个大招的释放方法。

一.KVC的使用

KVC在iOS开发中是绝不可少的利器,这种基于运行时的编程方式极大地提高了灵活性,简化了代码,甚至实现很多难以想像的功能,KVC也是许多iOS开发黑魔法的基础。

1.使用KVC访问和修改私有变量。

// 比如系统的tabbar为readonly想要直接改变是会报错的,那么我们可以使用kvc来使用我们自定义的tabbar替换系统的
// @property(nonatomic,readonly) UITabBar *tabBar;
[self setValue:tabbar forKey:@"tabBar"];

2.正向传值很方便

// 使用kvc进行页面传值,只需要在接受的VC定义属性接收就可以
LoginViewController *login = [[LoginViewController alloc] init];
[self setValue: userId forKey:@"userId"];

3.动态地取值和设值(可以通过keyPath多层取值)

Student *s = [[Student alloc] init];
s.name = @"xx";
Person *p = [[Person alloc] init];
p.student = s;

// 取name
Student *stu = [p valueForKeyPath:@"student.name"];

4.Model和字典转换(MJ的字典转模型框架)

5.修改一些控件的内部属性(配合runtime)

UITextField *tf = [[UITextField alloc] init];
[tf setValue:[UIColor redColor] forKey:@"placeholderLabel.textColor"];

6.从复杂数组中提取有效信息返回新的数组。操作集合

NSArray *arr = @[@{@"name":@"xx"},
                    @{@"name":@"yy"},
                    @{@"name":@"zz"}
                    ];                    
// 这个操作在某些情况下很方便,就看怎么运用好了
NSArray *names = [arr valueForKeyPath:@"name"];

7.在网络请求时创建一个可变字典传递构建参数,使用kvc可以过滤空值

NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
// 如果userId为空,使用setObject方法会崩溃
[parameters setObject:userId forKey:@"userId"];
// 使用setValue方法会过滤
[parameters setValue:userId forKey:@"userId"];

…….

二.KVC常用函数操作集合运算符

1.简单集合运算符

简单集合运算符共有

平均值:@avg, 数量:@count , 最大值:@max , 最小值:@min ,求和:@sum

2.对象运算符
比集合运算符稍微复杂,能以数组的方式返回指定的内容,一共有两种:

@distinctUnionOfObjects // 去重
@unionOfObjects // 不去重

它们的返回值都是NSArray,区别是前者返回的元素都是唯一的,是去重以后的结果;后者返回的元素是全集。

3.Array和Set操作符

@distinctUnionOfArrays:该操作会返回一个数组,这个数组包含不同的对象,不同的对象是在从关键路径到操作器右边的被指定的属性里

@unionOfArrays 该操作会返回一个数组,这个数组包含的对象是在从关键路径到操作器右边的被指定的属性里和@distinctUnionOfArrays不一样,重复的对象不会被移除

@distinctUnionOfSets 和@distinctUnionOfArrays类似。因为Set本身就不支持重复。