iOS OC利用运行时模型转字典

该博客介绍了如何使用Objective-C的运行时(runtime)将模型转换为字典。通过遍历模型的所有属性,根据属性类型进行相应的值转换,如Bool转字符串,字符串URL编码,处理嵌套的字典和数组等。并提供了`generateDict:`方法实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

+(NSMutableDictionary *)generateDict:(id)model{
    
    NSMutableDictionary *nameOrTypeDict = [self allPropertyNames:[model class]];
    NSMutableArray *allNames = nameOrTypeDict[@"name"];
    NSMutableArray *allType = nameOrTypeDict[@"type"];
    
    
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    for (int i = 0; i < allNames.count; ++i) {
        id str = [model valueForKey:allNames[i]];
        NSString *type = allType[i];
        //  NSLog(@"打印%@--%@",str,type);
        
      
      
        if (str != nil) {
          
            
        if ([type isEqualToString:@"Bool"]){
            NSLog(@"判断%@",str);
            
         str =   [NSString stringWithFormat:@"%@",str];
            if (![str isEqualToString:@"0"]) {

                [dict setValue:@"1" forKey:allNames[i]];

        }else{

            [dict setValue:@"0" forKey:allNames[i]];
        }
            
        }else if([type isEqualToString:NSStringFromClass([NSString class])]){
          
            str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
               [dict setValue:str forKey:allNames[i]];
            
        }else  if([str isKindOfClass:[NSDictionary class]]){
            
            NSDictionary *dict1 = (NSDictionary *)str;
            NSMutableDictionary *muDict = [NSMutableDictionary dictionary];
            [dict1 enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
               
                if ([obj isKindOfClass:[NSString class]]) {
                      obj = [obj stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                  
                    
                }
                
                [muDict setValue:obj forKey:key];
                
                
            }];
            
             [dict setValue:muDict forKey:allNames[i]];
            
            
            
        }else if([str isKindOfClass:[NSArray class]]){
            NSArray *arry = (NSArray *)str;
            NSMutableArray *array = [NSMutableArray array];
            [arry enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                
                NSLog(@"%@", obj);
                if([obj isKindOfClass:[XSMain class]]){
                    
                  obj =  [self generateDict:obj];
                    
                    
                }else   if ([obj isKindOfClass:[NSString class]]) {
                    obj = [obj stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                    
                 
                    
                }
                [array addObject:obj];
                
            }];
         
            [dict setValue:array forKey:allNames[i]];


            
        }else if([str isKindOfClass:[XSMain class]]){
            
            
          NSDictionary *dict1 =  [self generateDict:str];
            
            [dict setValue:dict1 forKey:allNames[i]];

        }else{
            
            [dict setValue:str forKey:allNames[i]];

        }
        
        }
    }
    return dict;
    
    
}


///通过运行时获取当前对象的所有属性的名称,以数组的形式返回
+ (NSMutableDictionary *) allPropertyNames:(Class)class{
   NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    ///存储所有的属性名称
  
    NSMutableArray *allNames = [[NSMutableArray alloc] init];
     NSMutableArray *allType = [[NSMutableArray alloc] init];
    ///存储属性的个数
    unsigned int propertyCount = 0;
     Ivar * ivarList = class_copyIvarList(class, &propertyCount);
    ///通过运行时获取当前类的属性
    objc_property_t *propertys = class_copyPropertyList(class, &propertyCount);
    
    //把属性放到数组中
    for (int i = 0; i < propertyCount; i ++) {
        ///取出第一个属性
       // objc_property_t property = propertys[i];
         Ivar ivar = ivarList[i];
//        const char * propertyName = property_getName(property);
   
        NSString *name = [NSString stringWithUTF8String:ivar_getName(ivar)];
        
        if ([name containsString:@"_"]) {
             
          name =  [name substringFromIndex:1];
            
             
             
    }
        
        NSString *type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
        if ([type isEqualToString:@"i"]) {
            type = @"int";
        }
        if ([type isEqualToString:@"B"]) {
            type = @"Bool";
        }
        
        if ([type isEqualToString:@"f"]) {
            type = @"float";
        }
        if ([type isEqualToString:@"d"]) {
            type = @"double";
        }
        
        if ([type containsString:@"\""]) {
             NSRange range = [type rangeOfString:@"\""];
             type = [type substringFromIndex:range.location + range.length];
             range = [type rangeOfString:@"\""];
             type = [type substringToIndex:range.location];
        }
      
     
        [allType addObject:type];
   
        [allNames addObject:name];
    }
   //  NSArray* reversedArray = [[allType reverseObjectEnumerator] allObjects];
    
    
    
    dict[@"type"] = allType;
    dict[@"name"] = allNames;
    ///释放
    free(propertys);
    
    return dict;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值