読者です 読者をやめる 読者になる 読者になる

It’s now or never

IT系の技術ブログです。気になったこと、勉強したことを備忘録的にまとめて行きます。

【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];
        }
    }

下記ページを参考にさせて頂きました。