IOS开发之动态获取模型的属性值

时间:2023-11-25 14:02:32
#import "model.h"
#import <objc/runtime.h>

@implementation model

+(instancetype)modelWithDict:(NSDictionary *)dict
{
       model *mo = [[model alloc] init];

       // 得到属性数组.
       NSArray *array = [mo getProperties];

       // 根据属性的值,去数据字典中取对应的值
       [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
              // key 属性值.
              NSString *key = obj;

              if (dict[key]) {
                     // 为了保证安全.
                     [mo setValue:dict[key] forKey:key];
              }

       }];

       // 赋值的时候,需要根据自身的属性值,来取dict字典中的属性.
       // 首先,需要能够获得 model 中的属性.
      // [mo setValuesForKeysWithDictionary:dict];

       return mo;
}

// 动态的获取某一个类的属性.
- (NSArray *)getProperties
{
       unsigned int count;

       // 获取一个类中的属性
       objc_property_t *properties = class_copyPropertyList(self.class, &count);

       NSMutableArray *array = [NSMutableArray array];

       // 遍历类中的属性,将每一个属性值都转换成 OC 的字符串
       for (int i = 0; i < count; i++) {

              // pro 依然是 C 语言的数据类型
              objc_property_t pro = properties[i];

              // 指向C 语言字符串一个指针.
              const char *name = property_getName(pro);

              NSString *property = [[NSString alloc] initWithUTF8String:name];

              NSLog(@"property:%@",property);

              [array addObject:property];
       }

       return array;
}