在 C# 里我们常用 .net reflect 类库配合typeof/getType来反射设置函数与字段等等。在iOS里也有这样的功能,比C#的门槛低的多。只要你合乎规范的定义函数与属性字段,就能方便的使用。

使用KVC

下面的函数 我将接通过KVC的接口 setValue forKey && setValue forKeyPath ,来设置属性 与 调用方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#import <Foundation/Foundation.h>
#import "Foo.h"
#import "Bar.h"

int main(int argc, const char * argv[]) {
Foo* foo = [[Foo alloc]init];
foo.bar = [[Bar alloc]init];


[foo setValue:@"blah blah" forKey:@"stringOnFoo"];
[foo setValue:@"testforkeyle" forKeyPath:@"bar.stringOnBar"];
[foo valueForKeyPath:@"Log"];//Just Test log 直接访问了实例方法


NSLog(@"%@",foo.bar.stringOnBar); //testforkeyle
NSLog(@"%@",foo.stringOnFoo); //blah blah
return 0;
}

使用KVC在便利数组上尤为方便,下面是使用@sum函数直接给数组的price属性求和。

1
[foo.bar.array valueForKeyPath:@"@sum.price"];

KVC的其他函数

1
2
3
4
5
6
7
8
9
//对于KVC的一些命令 ,如果要操作 NSArray 之类的字典可以方便的调用。类似C#的Linq for Object
@avg
@count
@max
@min
@sum
@unionOfArrays/@distinctUnionOfArrays //返回一个包含所有数组的数组 / 返回一个不重复的集合元素
@unionOfSets/@distinctUnionOfSets //返回一个包含所有集合的集合 / 返回一个不重复的集合元素
@unionOfObjects/@distinctUnionOfObjects //返回一个包含所有元素的数组 / 返回一个不重复元素的数组

使用要求

  1. 骆驼命名法,不能数字开头
  2. 不能包含空格
  3. 键必须是ASCII编码的
  4. 使用默认的get/set