標籤:
1.從plist中載入的資料
2.
字典轉模型
1.字典轉模型介紹
:
字典轉模型的好處:
(1)降低代碼的耦合度
(2)所有字典轉模型部分的代碼統一集中在一處處理,降低代碼出錯的幾率
(3)在程式中直接使用模型的屬性操作,提高編碼效率
(4)調用方不用關心模型內部的任何處理細節
字典轉模型的注意點:
模型應該提供一個可以傳入字典參數的構造方法
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)xxxWithDict:(NSDictionary *)dict;
提示:在模型中合理地使用唯讀屬性,可以進一步降低代碼的耦合度。
3.代碼
// 字典轉模型 11 - (NSArray *)appList 12 { 13 if (!_appList) { 14 // 1. 從mainBundle載入 15 NSBundle *bundle = [NSBundle mainBundle]; 16 NSString *path = [bundle pathForResource:@"app.plist" ofType:nil]; 17 // _appList = [NSArray arrayWithContentsOfFile:path]; 18 19 NSArray *array = [NSArray arrayWithContentsOfFile:path]; 20 // 將數群組轉換成模型,意味著self.appList中儲存的是LFAppInfo對象 21 // 1. 遍曆數組,將數組中的字典依次轉換成AppInfo對象,添加到一個臨時數組 22 // 2. self.appList = 臨時數組 23 24 NSMutableArray *arrayM = [NSMutableArray array]; 25 for (NSDictionary *dict in array) { 26 //用字典來執行個體化對象的Factory 方法 27 [arrayM addObject:[LFAppInfo appInfoWithDict:dict]]; 28 } 29 30 _appList = arrayM; 31 } 32 return _appList; 33 }
3.2模型代碼
11 - (instancetype)initWithDict:(NSDictionary *)dict12 {13 self = [super init];14 if (self) {15 self.name = dict[@"name"];16 self.icon = dict[@"icon"];17 }18 return self;19 }20 21 + (instancetype)appInfoWithDict:(NSDictionary *)dict22 {23 return [[self alloc] initWithDict:dict];24 }
3.3
(KVC)的使用
(1)在模型內部的資料處理部分,可以使用索引值編碼來進行處理
1 - (instancetype)initWithDict:(NSDictionary *)dict 2 { 3 self = [super init]; 4 if (self) { 5 // self.answer = dict[@"answer"]; 6 // self.icon = dict[@"icon"]; 7 // self.title = dict[@"title"]; 8 // self.options = dict[@"options"]; 9 10 // KVC (key value coding)索引值編碼11 // cocoa 的大招,允許間接修改對象的屬性值12 // 第一個參數是字典的數值13 // 第二個參數是類的屬性14 [self setValue:dict[@"answer"] forKeyPath:@"answer"];15 [self setValue:dict[@"icon"] forKeyPath:@"icon"];16 [self setValue:dict[@"title"] forKeyPath:@"title"];17 [self setValue:dict[@"options"] forKeyPath:@"options"];18 }19 return self;20 }
(2)setValuesForKeys的使用
上述資料操作細節,可以直接通過setValuesForKeys方法來完成。
1 - (instancetype)initWithDict:(NSDictionary *)dict2 {3 self = [super init];4 if (self) {5 // 使用setValuesForKeys要求類的屬性必須在字典中存在,可以比字典中的索引值多,但是不能少。6 [self setValuesForKeysWithDictionary:dict];7 }8 return self;9 }
三、補充說明
1.readonly屬性
(1)@property中readonly表示不允許修改對象的指標地址,但是可以修改對象的屬性。
(2)通常使用@property關鍵字定義屬性時,會產生getter&setter方法,還會產生一個帶底線的成員變數。
(3)如果是readonly屬性,只會產生getter方法,不會產生帶底線的成員變數.
2.instancetype類型
(1)instancetype會讓編譯器檢查執行個體化對象的準確類型
(2)instancetype只能用於傳回型別,不能當做參數使用
3.instancetype & id的比較
(1) instancetype在類型表示上,跟id一樣,可以表示任何物件類型
(2) instancetype只能用在傳回值類型上,不能像id一樣用在參數類型上
(3) instancetype比id多一個好處:編譯器會檢測instancetype的真實類型
iOS開發UI篇—字典轉模型