博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
封装数据模型
阅读量:4924 次
发布时间:2019-06-11

本文共 2799 字,大约阅读时间需要 9 分钟。

1.封装数据模型可能遇到的情况

1)外界访问模型中没有的属性(需要添加防止崩溃代码)
2)数据模型中存在与关键字冲突的属性名(需要对属性名进行转换)
3)数据模型中又包含有别的数据模型时(需要对此类属性在整体kvc之后,进行单独设置)
2.一般思路
1)先根据后台提供的开发文档,设置属性值(必须通文档相同)与关键字,NSString 用copy;int 用assign关键字
2)提供一个初始化此类数据模型的类方法和对象方法
 一般的命名如下:
+(instancetype)模型名(去掉前缀)WithDict:(NSDictionary *)dict;
- (instancetype)initWithDict:(NSDictionary *)dict;
3)实现提供的类方法和对象方法
+(instancetype)模型名(去掉前缀)WithDict:(NSDictionary *)dict
{
  return [[self alloc] initWithDict:dict];
}
- (instancetype)initWithDict:(NSDictionary *)dict
{
//一般构造方法,都是需要判断其父类方法是否返回真值
if (self = [super init]) {
        // 1.注入所有属性
        [self setValuesForKeysWithDictionary:dict];
        // 2.特殊处理friends属性
        NSMutableArray *friendArray = [NSMutableArray array];
        for (NSDictionary *dict in self.friends) {
            MJFriend *friend = [MJFriend friendWithDict:dict];
            [friendArray addObject:friend];
        }
        self.friends = friendArray;
    }
    return self;
}
4).1中提到的一些优化
防止外界访问不存在的属性时崩溃
- (id) valueForUndefineKey:(NSString *)key
{
     return nil;
}
为与关键字重复的成员变量进行转换
- (void)setValue:(id)value forUndefineKey:(NSString *)key
{
    if([key isEqualtoString:@"id"])
{
     _heroID = value;
}
}
3.关键代码

1 // 2 //  MJFriendGroup.h 3 //  03-QQ好友列表 4 // 5 //  Created by apple on 14-4-3. 6 //  Copyright (c) 2014年 itcast. All rights reserved. 7 // 8  9 #import 
10 11 @interface MJFriendGroup : NSObject12 @property (nonatomic, copy) NSString *name;13 /**14 * 数组中装的都是MJFriend模型15 */16 @property (nonatomic, strong) NSArray *friends;17 @property (nonatomic, assign) int online;18 @property (nonatomic,copy) NSString * groupID;19 20 /**21 * 标识这组是否需要展开, YES : 展开 , NO : 关闭22 */23 @property (nonatomic, assign, getter = isOpened) BOOL opened;24 25 + (instancetype)groupWithDict:(NSDictionary *)dict;26 - (instancetype)initWithDict:(NSDictionary *)dict;27 @end
MJFriendGroup.h
1 #import "MJFriendGroup.h" 2 #import "MJFriend.h" 3  4 @implementation MJFriendGroup 5 + (instancetype)groupWithDict:(NSDictionary *)dict 6 { 7     return [[self alloc] initWithDict:dict]; 8 } 9 10 - (instancetype)initWithDict:(NSDictionary *)dict11 {12     if (self = [super init]) {13         // 1.注入所有属性14         [self setValuesForKeysWithDictionary:dict];15         16         // 2.特殊处理friends属性17         NSMutableArray *friendArray = [NSMutableArray array];18         for (NSDictionary *dict in self.friends) {19             MJFriend *friend = [MJFriend friendWithDict:dict];20             [friendArray addObject:friend];21         }22         self.friends = friendArray;23     }24     return self;25 }26 //防止外界访问不存在属性报错27 - (id)valueForUndefinedKey:(NSString *)key28 {29     return nil;30 }31 32 - (void)setValue:(id)value forKey:(NSString *)key33 {34     if ([key isEqualToString:@"id"]) {35         _groupID = value;36     }37     38 }39 @end
MJFriendGroup.m

 

转载于:https://www.cnblogs.com/2832527467xuxia/p/5849481.html

你可能感兴趣的文章
vector和list的区别
查看>>
[LeetCode] 127. Word Ladder _Medium tag: BFS
查看>>
20172302 《程序设计与数据结构》第四周学习总结
查看>>
FZU 2086 餐厅点餐(枚举)
查看>>
HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者(基础巴什博奕)
查看>>
多态,虚函数
查看>>
Could not obtain information about Windows NT group/user 'xxxx\xxxx', error code 0x5
查看>>
get_locked_objects_rpt.sql
查看>>
基于SignalR的消息推送与二维码描登录实现
查看>>
jquery 绑定事件
查看>>
排序之快速排序
查看>>
单调队列&单调栈归纳
查看>>
新安装的jdk,不知道为啥一直走别的jdk路径
查看>>
leetcode 9. Palindrome Number
查看>>
2018/1/9 redis学习笔记(一)
查看>>
协程 - 单线程并发--day36
查看>>
oracle存储过程遇到的问题
查看>>
如何使用WPS从正文开始页码为1,而不是从目录开始?
查看>>
C# Select
查看>>
【转】关于Scapy
查看>>