核心思想,给模型的变量设置默认值,例如字符串设置默认值为 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 给模型数组赋值