iOS開發UI篇—字典轉模型

來源:互聯網
上載者:User

標籤:

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篇—字典轉模型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.