【Objective-C】独自クラスのプロパティ名の一覧を取得する
独自で作成したクラスのプロパティは、
Objective-C Runtime
から取得することが可能です。
- 下記ヘッダをインポート
#import "objc/runtime.h"
- プロパティのリストは、下記関数で取得する
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount);
- プロパティの名前は、下記関数で取得する
const char *property_getName(objc_property_t property);
下記のようなメソッドを作成すれば、任意のクラスのプロパティ一覧が取得できます。
- (NSArray *)propertyNames:(Class)class { unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList(class, &outCount); NSMutableArray *arr = [NSMutableArray array]; for(i = 0; i < outCount; i++) { objc_property_t property = properties[i]; const char *propName = property_getName(property); if(propName) { NSString *propertyName = [NSString stringWithCString:propName encoding:NSUTF8StringEncoding]; [arr addObject:propertyName]; } } free(properties); return arr; }
今まで、サーバーから取得したJSONデータなどをモデルクラスへ変換するのが面倒だと思っていました。
下記のようにすれば、かなり楽に実装できそうです。
NSDictionary *jsonDic = ・・・ OriginClass *origin = [[OriginClass alloc] init]; NSArray *propertyList = [self propertyNames:[OriginClass class]]; for (NSString *key in jsonDic) { //キーがあれば格納する if ([propertyList containsObject:key]) { [origin setValue:jsonDic[key] forKey:key]; } }
下記ページを参考にさせて頂きました。