当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS KVC-对象初始化赋值的神级技巧

iOS KVC-对象初始化赋值的神级技巧

2018年09月16日  | 移动技术网IT编程  | 我要评论

杨宗纬会呼吸的痛,编织人生毛衣,德惠二手房

ios kvc-对象初始化赋值的神级技巧。网络请求之后最重要的一步就是把字典数据转化成类对像了,这一步很简单,但通常也异常繁琐,因为为了使程序健壮,我们首先会判断字典中是否存在这个key对应的value,如果存在则赋值,不存在则跳过。

此篇文章将给出一个比较简单的初始化类对象的技巧,应用场景是最常见的通过字典数据初始化类对像。

原理是通过kvc提供的- (void)setvaluesforkeyswithdictionary:方法达到快速初始化的目的,代码简洁,不易出错。

demo如下:

//poiinfor.h
@interface poiinfor : nsobject

@property(nonatomic, assign)nsinteger   userid;
@property(nonatomic, assign)double      createtime;
@property(nonatomic, copy) nsstring     * summary;
@property(nonatomic, copy) nsstring     * content;
@property(nonatomic, strong)nsnumber    * inforid;
@property(nonatomic, strong)nsnumber    * likenum;
@property(nonatomic, strong)nsnumber    * readnum;
@property(nonatomic, strong)nsarray     * photos;//每个元素都是poiphoto类型
@property(nonatomic, strong)nsnumber    * iseditphoto;

/**
 通过字典创建并初始化一个类对像
题外话:
alt+command+/可给方法添加注释,按住alt点击方法名即会出现注释内容,类似系统api注释,建议以此方法添加注释
 */
+ (instancetype)infowithdictionary:(nsdictionary *)dict;
- (instancetype)initwithdictionary:(nsdictionary *)dict;

@end

//poiinfor.m
@implementation poiinfor

+ (instancetype)infowithdictionary:(nsdictionary *)dict
{
    return [[poiinfor alloc] initwithdictionary:dict];
}

- (instancetype)initwithdictionary:(nsdictionary *)dict{
    self = [super init];
    if (self) {
        //通过kvc方法可快速通过字典给对像赋值,将字典中的value赋值给与其key同名的property[基本数据类型(比如int等)无需做特殊处理]
        [self setvaluesforkeyswithdictionary:dict];
    }
    return self;
}

- (void)setvalue:(id)value forkey:(nsstring *)key{
    if ([key isequaltostring:@"id"]) {
        key = @"userid";
    }
    else if ([key isequaltostring:@"photos"]){
        //遍历value数组,按照和poiinfor相同的方式创建并初始化poiphoto对像
        __block nsmutablearray  * photos = [@[] mutablecopy];
        if ([value iskindofclass:[nsarray class]]) {
            [value enumerateobjectsusingblock:^(nsdictionary * _nonnull obj, nsuinteger idx, bool * _nonnull stop) {
                if ([obj iskindofclass:[nsdictionary class]]){
                    //poiphoto没有写便利构造器,可按步就班的初始化
                    poiphoto    * photo = [poiphoto new];
                    [photo setvaluesforkeyswithdictionary:obj];
                    [photos addobject:photo];
                }
            }];
        }
        value = photos;
    }

    [super setvalue:value forkey:key];
}
//此方法建议实现,否则很可能有崩溃风险
- (void)setvalue:(id)value forundefinedkey:(nsstring *)key{
    nslog(@" -- undefined key : %@ -- ",key);
    //当调用setvaluesforkeyswithdictionary:时,首先会调用setvalue:forkey:方法,当找不到key对应的property时,便会调用setvalue:forundefinedkey:方法进行进一步的处理
    //如果有此方法,则可以处理找不到的key,若未实现此方法,则程序会出现崩溃
    //因此为了保持程序健壮,使用setvaluesforkeyswithdictionary:方法初始化的类必须重写此方法,一般空实现即可
}

@end

从此以后便可丢弃一大串的if-else了,是不是很爽?
夜深人静,天明还要上班,写得比较捉急,不明白的地方欢迎留言讨论,该方法如有不妥或不足之处,欢迎指正。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网