彻底解决oc和 swift 字典转模型时解决json为nil时候的闪退问题

核心思想,给模型的变量设置默认值,例如字符串设置默认值为 oc @"" swift “”

写在前面,因为最近跳槽,换了工作,以前swift写的多,到了新公司好多oc的老代码,发现经常出现json数据为空的时候闪退,所以借鉴了我再swift里面建模型的思想改了一下oc

例如下面的oc模型 HDNotTeacher
//  HDNotTeacher.h
@interface HDNotTeacher : NSObject
@property (nonatomic , copy) NSString *taskId;
@property (nonatomic , copy) NSString *taskName;
@property (nonatomic , copy) NSString *createTime;
@property (nonatomic , copy) NSString *templateTypeId;
@property (nonatomic , copy) NSString *businessId;
@property (nonatomic , copy) NSString *userName;
@property (nonatomic,copy)NSString *testStr;

@end

.m文件

//  HDNotTeacher.m

//

#import "HDNotTeacher.h"

@implementation HDNotTeacher

- (instancetype)init
{
    self = [super init];
    if (self) {
        _taskId = @"";
        _taskName = @"";
        _createTime = @"";
        _templateTypeId = @"";
        _businessId = @"";
        _userName = @"";
        _testStr = @"";
    }
    return self;
}

/*
- (void)setValue:(id)value forKey:(NSString *)key{
    if (nil == value){
        NSLog(@"setValue forKey key=%@ value=%@",key,value);
        [super setValue:@"" forKey:key];
        NSLog(@"setValue 执行赋值@"" 之后 forKey key=%@ value=%@",key,value);
    }else{
        [super setValue:value forKey:key];
    }
}
*/
//注意这里的setValue for key一会会说到,当json值为空的时候setValuesForKeysWithDictionary: 不会调用setValue,这里把注释打开可以测试nil不调用setValue forkey
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
    NSLog(@"forUndefinedKey key=%@ value=%@",key,value);
}
- (NSString *)description
{
    return [NSString stringWithFormat:@"_taskId=%@,_taskName=%@,_createTime=%@,_templateTypeId=%@,_businessId=%@,_userName=%@,_testStr=%@",_taskId,_taskName,_createTime,_templateTypeId,_businessId,_userName,_testStr];
}
@end

再看调用地方的结果:先用系统自带的字典遍历赋值

下面是取到json存入字典里的赋值

  NSMutableDictionary * tempDic = [dic objectForKey:@"task"];
                [model setValue:@"123" forKey:@"testStr2"];//如意放一个
                [model setValuesForKeysWithDictionary:tempDic];
                

下面是json里面数据 字典转模型

for (NSDictionary *dic in arr) {
                HDNotTeacher *model = [HDNotTeacher new];
                NSMutableDictionary * tempDic = [dic objectForKey:@"task"];
//
                [model setValue:@"123" forKey:@"testStr2"];
                model = [HDNotTeacher yy_modelWithDictionary:tempDic];
//                [model setValuesForKeysWithDictionary:tempDic]; //这里用yymodel或者setValuesForKeysWithDictionary:tempDic都行
                [self->dataArray addObject:model];
                NSLog(@"model.testStr=%@",model.testStr);
                 

            }

调试lldb打印输出结果

(lldb) po model
_taskId=TASK0777da4a484241f7ba0fe7524874e4da,_taskName=测试每周健康统计,_createTime=2020-09-17 00:00:00,_templateTypeId=TEMP5dd101f5490c45b9a08922cde6ddb451,_businessId=,_userName=,_testStr=

在这里插入图片描述

下面上swift 代码
//  HomeItem.swift
//  dragonWingAdvanceSale
//
//  Created by tdw on 2019/11/14.
//  Copyright © 2019 tdw. All rights reserved.
//

import UIKit
import KakaJSON
/**
 首页嵌套模型

 */
class HomeItem: NSObject,Convertible  {
    /**   设备大类图片地址    */
    @objc var typeUrl:String = ""
    /**  设备大类码值  */
    @objc var typeId:String = ""
    /**   设备大类名 */
    @objc var typeName:String = ""
    /**  设备数组变量  */
    @objc var subsets : [SubsetsItem]?
    /**  设备小类接入厂家数量  */
    @objc var typeNum:Int = 0
    
    
    required override init() {
    }
    
    override var description:String  {
        return self.dictionaryWithValues(forKeys: ["typeUrl","typeId","typeName","subsets","typeNum"]).description
    }
    
}
数据赋值:
 //HomeItem
 var homeItems = [HomeItem]()

 //读取json数据省略,下面直接上json转模型:
 
let jsons = jsons["responseList"].arrayObject //json数据
guard let models =  jsons?.kj.modelArray(HomeItem.self) else {return} //用KakaJSON 给模型数组赋值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值