股票场内基金交易,没时间盯盘?
我们在使用字典的时候,在获取其中的内容的时候需要手写字符串 key 来获取内容,但是在输入 key 时,Xcode 系统是没有提示和补全的,往往需要程序员自己去查看字典的各种 key 值,而且如果 key 输错了也不会有报错和警告。因此使用起来比较麻烦。为了解决这个问题,可以将字典转为模型(即一个自定义的对象,从其成员变量中获取需要的数据)。这样做的好处是:
- 降低代码的耦合度,简化代码并易于理解修改。
- 所有需要字典内容部分的代码可以替换为自定义模型的内容,并集中获取,不易出错。
工程文件
本文所用实例的工程文件见:DictionaryToModel@GitHub
字典转模型的实现
包括如下步骤:
- 创建一个自定义类来装载模型
- 使用 @property 在该类中添加与字典相应的属性
- 对属性从字典中获取内容进行赋值
- 建立该类相应的成员方法创建和类方法创建
实例
通过一个实例来展示 “字典转模型” 的使用。该工程中数据(包括要加载的文字内容和图片名)存储以字典的形式存储在 plist 文件中。我们需要先从 plist 中加载文件来获得字典,存储在一个存放字典的数组中。然后通过字典转模型来获取模型对象,存放在放置模型对象的数组中。之后在使用中直接调用该自定义模型对象就可以啦。该 plist 包括 11 项内容,每个字典有两个key: name 和 icon,分别记录需要载入的名字(NSString 对象)和需要载入的图片的名字(NSString 对象),需要载入的图片存储在 Assets.xcassets 中,根据 icon 内容来获取。而设计的模型包括三个内容,即 name、icon、和 image。增加的这个内容时根据 icon 名字取出的图片并加载到了 UIImage 中,以简化接下来的代码。
-
plist -> 字典
该工程的 plist 文件 app.plist 存储与 Navigator 中的 Supporting Files 中,需要先用数组将其内容一项项取出来并表示为字典。首先建立一个数组 appList:
123456@interface ViewController ()@property(strong, nonatomic)NSArray *appList;@end然后覆写 appList getter 方法
12345678- (NSArray *)appList{if (!_appList) {NSBundle *bundle = [NSBundle mainBundle]; //用于从 Navigator 中获取文件NSString *path = [bundle pathForResource:@"app.plist" ofType:nil];NSArray *array = [NSArray arrayWithContentsOfFile:path];……}}这样的话数组 array 中的每个内容都是一个字典对象了。
-
自定义模型对象
-
新建类名为 AppInfo,并且在 .h 中需要导入:
1#import -
声明三个属性
12345678//应用程序名称@property (nonatomic, copy) NSString *name;//应用程序图标名称@property (nonatomic, copy) NSString *icon;//图像@property (nonatomic, strong, readonly) UIImage *image; -
属性赋值 & init 方法
name、icon 的初始化赋值在 init 方法中进行,首先在 .h 文件中声明:
- (instancetype)initWithDict:(NSDictionary *)dict;
然后在 .m 中实现,name 与 icon 对应字典中 dict[@”name”]、dict[@”icon”]。12345678- (instancetype)initWithDict:(NSDictionary *)dict{self = [super init];if (self) {self.name = dict[@"name"];self.icon = dict[@"icon"];}return self;}这里的 instancetype 相当于 id,不过 instancetype 会让编译器检查实例化对象的准确类型,它只能用于返回类型,不能当作参数使用。例如如果使用
NSString *s = [[NSString alloc] initWithDict:(NSDictionary *)dict];
编译器就会报错。image 的初始化需要根据 self.icon 的值来加载图像。在这里使用@property声明 image 属性时使用 readonly 的原因是,增加封装性,防止误操作修改 image 的内容。
一般而言,定义属性时,会生成 getter & setter 方法,还会生成一个带下划线的成员变量。但是使用 readonly 时,只有 getter 方法,没有带下划线的成员变量。解决方法:自己在 .m 文件中添加一个私有扩展变量。
在 .m 文件中声明:12345@interface AppInfo (){UIImage *_imageExtra;}然后覆写 image getter 方法:
1234567- (UIImage *)image{if (!_imageExtra) {_imageExtra = [UIImage imageNamed:self.icon];}return _imageExtra;} -
创建初始化类方法
在 initWithDict: 的基础上进行添加即可
123+ (instancetype)appInfoWithDict:(NSDictionary *)dict{return [[self alloc] initWithDict:dict];}
-
-
字典 -> 模型
将 appList 方法修改为:
1234567891011121314- (NSArray *)appList{if (!_appList) {NSBundle *bundle = [NSBundle mainBundle]; //用于从 Navigator 中获取文件NSString *path = [bundle pathForResource:@"app.plist" ofType:nil];NSArray *array = [NSArray arrayWithContentsOfFile:path];NSMutableArray *arrayM = [NSMutableArray array];for (NSDictionary *dict in array){[arrayM addObject:[AppInfo appInfoWithDict:dict]];}_appList = arrayM;//相比而言 array 中 存的是字典,而 arrayM 中存的是 Appinfo}return _appList;}这样的话模型对象已被初始化存储在 appList 数组中。我们在使用时就可以直接拿来用了。例如
1imageView.image = appList[i].image;
想获得去掉 5 元限制的证券账户吗?

如果您想去掉最低交易佣金 5 元限制,使用微信扫描左边小程序二维码,访问微信小程序「优财助手」,点击底部菜单「福利」,阅读文章「通过优财开证券账户无最低交易佣金 5 元限制」,按照文章步骤操作即可获得免 5 元证券账户,股票基金交易手续费率万 2.5。
请注意,一定要按照文章描述严格操作,如错误开户是无法获得免 5 元证券账户的。