iOS摸鱼周报,主要分享大家开发过程遇到的经验教训及学习内容。虽说是周报,但当前内容的贡献途径还未稳定下来,如果后续的内容不足一期,可能会拖更到下一周再发。所以希望大家可以多分享自己学到的开发小技巧和解bug经历。
周报仓库在这里:https://github.com/zhangferry/iOSWeeklyLearning ,可以查看README了解贡献方式;另可关注公众号:iOS成长之路,后台点击进群交流,联系我们。
开发Tips
开发小技巧收录。
YYModel解析数据提供默认值
当在OC中使用YYModel解析JSON数据时,对于不存在或者返回null
的数据都会按照nil
处理。而有些时候我们可能不希望该字段被置为nil,而是希望提供一个默认值,比如NSString类型,如果无法解析就返回@""
,空字符串。这在一些需要把特定参数包到NSDictionary或者NSArray里的场景不会引起崩溃,也省去了一些判断判空的代码。
实现这个目的需要两个步骤:
1、找到特性类型的属性
可以使用runtime提供的property_copyAttributeList
方法,主要代码是:
objectivec static const char *getPropertyType(objc_property_t property) { //这里也可以利用YYClassPropertyInfo获取对应数据 unsigned int attrCount; objc_property_attribute_t *attrs = property_copyAttributeList(property, &attrCount); if (attrs[0].name[0] == 'T') { return attrs[0].value; } return ""; }
通过attrs[0].name[0] == 'T'
找到对应属性的编码类型,取出value,NSString对应的value
是@"NSString"
。
其他的编码类型可以参考这里。
找到需要替换的属性就可以替换了,使用KVC的形式:
objectivec [self setValue:obj forKey:propertyName];
2、在JSON换Model完成的时候进行默认值替换
这段函数写到哪里合适呢,在NSObject+YYModel.h里找到了这个方法:
objectivec - (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic;
该方法用于校验转成的Model是否符合预期,执行到这里时Model已经完成了转换,我们就可以在这里调用上面写的默认值替换方法。
封装使用
我已经写好了一个实现,代码在