在 C# 里我们常用 .net reflect 类库配合typeof/getType来反射设置函数与字段等等。在iOS里也有这样的功能,比C#的门槛低的多。只要你合乎规范的定义函数与属性字段,就能方便的使用。
下面的函数 我将接通过KVC的接口 setValue forKey && setValue forKeyPath ,来设置属性 与 调用方法。
#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属性求和。
[foo.bar.array valueForKeyPath:@"@sum.price"];
//对于KVC的一些命令 ,如果要操作 NSArray 之类的字典可以方便的调用。类似C#的Linq for Object
@avg
@count
@max
@min
@sum
@unionOfArrays/@distinctUnionOfArrays //返回一个包含所有数组的数组 / 返回一个不重复的集合元素
@unionOfSets/@distinctUnionOfSets //返回一个包含所有集合的集合 / 返回一个不重复的集合元素
@unionOfObjects/@distinctUnionOfObjects //返回一个包含所有元素的数组 / 返回一个不重复元素的数组