亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS開發之使用Runtime給Model類賦值

2019-11-14 18:38:37
字體:
來源:轉載
供稿:網友

  本篇博客算是給網絡緩存打個基礎吧,本篇博客先給出簡單也是最容易使用的把字典轉成實體類的方法,然后在給出如何使用Runtime來給Model實體類賦值。本篇博客會介紹一部分,主要是字典的key與Model的屬性名相同時,使用Runtime來進行賦值,下篇博客會給出字典key的值和Model的名字不同時的解決方案,并給出使用Runtime打印實體類屬性值的方式。

  當然你可以使用KVC的setValuesForKeysWithDictionary:方法,下面的方法也是一種解決方案。如果使用setValuesForKeysWithDictionary:方法,則Model基類中必須得重寫下面的方法,不然如果遇到字典的Key和modle的屬性不對應的情況則會出現程序崩潰的情況。

-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}

  iOS開發中的Runtime可謂是功能強大,同時Runtime使用起來也是非常靈活的,今天博客的內容主要就是使用到一丁點的Runtime的東西。好廢話不多說了進入今天的整體。

  一、創建我們的測試工程

    在本測試工程中使用不到iOS開發的UI部分,所以我們就創建一個基于系統控制臺的工程,主調用代碼當然是放到main函數中了,PRoject創建過程如下圖所示,Create new project -> OS X -> application -> Command Line Tool ->一路next即可

 

  二、創建我們的測試數據

   1.首先使用for循環創建一個字典,當然字典的key和value在這是有規律的,下面的for循環是創建我們的測試數據,如果在有網絡請求的狀態下,該測試字典的來源就是你從網絡請求的JOSN解析出來的字典,在這兒沒有進行網絡請求,因為網絡請求不是本篇博客的重點,所以就使用for循環生成一個測試字典以供使用。創建測試字典的代碼如下,改代碼的位置放在main函數當中:

 1         NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithCapacity:11]; 2          3         //創建測試適用的字典 4         for(int i = 0; i <= 10; i ++){ 5             NSString *key = [NSString stringWithFormat:@"girl%d", i]; 6              7             NSString *value = [NSString stringWithFormat:@"我是第%d個女孩", i]; 8              9             [data setObject:value forKey:key];10         }

 

  上述代碼生成字典,打印結果如下,可以看出字典是無序的,接下來就將data這個字典作為我們網絡請求JSON解析后的字典來使用。

 1 2015-07-20 22:33:15.742 BaseModelProject[65321:3224966] data = { 2     girl0 = "我是第0個女孩"; 3     girl1 = "我是第1個女孩"; 4     girl10 = "我是第10個女孩"; 5     girl2 = "我是第2個女孩"; 6     girl3 = "我是第3個女孩"; 7     girl4 = "我是第4個女孩"; 8     girl5 = "我是第5個女孩"; 9     girl6 = "我是第6個女孩";10     girl7 = "我是第7個女孩";11     girl8 = "我是第8個女孩";12     girl9 = "我是第9個女孩";13 }

 

  三、創建data字典對應的實體類

    接下來將會創建Data字典對應的實體類,首先將會實現實體類的屬性名和字典的key值一致的情況,然后在下篇博客中將會實現如何把不同key值的字典轉換成實體類的屬性。

    1、首先我們先創建一個實體類,這個實體類要繼承與實體基類,因為一些公用的方法是在實體基類中進行編寫的,如便利構造器,便利初始化方法,把字典轉成Model屬性等方法回被抽象到這個基類當中。創建實體類如下圖所示,創建類的時候選中創建的基類即可:

 

    2. 這個實體類的命名為:BeautifulGirlModel,下面是BeautifulGirlModel中的屬性,屬性的名字和字典key的值相同,如下所示,BaseModelObject是之前創建的基類,BaseModelObject繼承與NSObject即可。

 1 // 2 //  BeautifulGirlModel.h 3 //  BaseModelProject 4 // 5 //  Created by Mr.LuDashi on 15/7/20. 6 //  Copyright (c) 2015年 ludashi. All rights reserved. 7 // 8  9 #import "BaseModelObject.h"10 11 @interface BeautifulGirlModel : BaseModelObject12 13 @property (nonatomic, copy) NSString *girl0;14 @property (nonatomic, copy) NSString *girl1;15 @property (nonatomic, copy) NSString *girl2;16 @property (nonatomic, copy) NSString *girl3;17 @property (nonatomic, copy) NSString *girl4;18 @property (nonatomic, copy) NSString *girl5;19 @property (nonatomic, copy) NSString *girl6;20 @property (nonatomic, copy) NSString *girl7;21 @property (nonatomic, copy) NSString *girl8;22 @property (nonatomic, copy) NSString *girl9;23 @property (nonatomic, copy) NSString *girl10;24 25 @end

 

  四、實現實體基類中的方法。

    實體基類中的方法是從各個Model中抽象出來的并且可以重復利用的部分,在實體基類的方法中大致包括:生成getter方法,生成setter方法,獲取Model類的屬性,把字典的值賦給對應的Model, 動態的調用getter方法對實體類的屬性值進行遍歷。本篇博客中回給出一部分,剩下的一部分會在以后的博客中陸續給出。

  1.根據Key值生成set方法

    首先要編寫的方法是傳入一個字符串,然后返回該字符串所對應屬性的setter方法。這個方法其實很簡單的,就是把對應的字符串的首字母大寫并且拼接上set關鍵字,再生產SEL并返回,該方法的具體實現如下:

 1 #pragma mark -- 通過字符串來創建該字符串的Setter方法,并返回 2 - (SEL) creatSetterWithPropertyName: (NSString *) propertyName{ 3      4     //1.首字母大寫 5     propertyName = propertyName.capitalizedString; 6      7     //2.拼接上set關鍵字 8     propertyName = [NSString stringWithFormat:@"set%@:", propertyName]; 9     10     //3.返回set方法11     return NSSelectorFromString(propertyName);12 }

 

  2.把字典傳入到方法中,并把字典的值賦給相應實體類的屬性,該方法需要調用上述方法來生成setter方法,通過setter方法把字典的Value賦值給實體類對應的屬性,代碼如下,下面代碼中的注釋還是比較詳細的,具體細節就參考下面注釋的內容了。通過調用這個方法就可以把字典的值賦給對應的實體類的屬性,調用這個方法的前提是要求字典的key與實體類的屬性名必須相同。有的小伙伴會問如果不一樣該怎么做呢?這個問題到下篇博客中在進行介紹。

 1 /************************************************************************ 2  *把字典賦值給當前實體類的屬性 3  *參數:字典 4  *適用情況:當網絡請求的數據的key與實體類的屬性相同時可以通過此方法吧字典的Value 5  *        賦值給實體類的屬性 6  ************************************************************************/ 7  8 -(void) assginToPropertyWithDictionary: (NSDictionary *) data{ 9     10     if (data == nil) {11         return;12     }13     14     ///1.獲取字典的key15     NSArray *dicKey = [data allKeys];16     17     ///2.循環遍歷字典key, 并且動態生成實體類的setter方法,把字典的Value通過setter方法18     ///賦值給實體類的屬性19     for (int i = 0; i < dicKey.count; i ++) {20         21         ///2.1 通過getSetterSelWithAttibuteName 方法來獲取實體類的set方法22         SEL setSel = [self creatSetterWithPropertyName:dicKey[i]];23         24         if ([self respondsToSelector:setSel]) {25             ///2.2 獲取字典中key對應的value26             NSString  *value = [NSString stringWithFormat:@"%@", data[dicKey[i]]];27             28             ///2.3 把值通過setter方法賦值給實體類的屬性29             [self performSelectorOnMainThread:setSel30                                    withObject:value31                                 waitUntilDone:[NSThread isMainThread]];32         }33         34     }35     36 }

 

  3.接下來就是開始編寫實體類的入口了,也就是便利初始化方法和便利構造器。并在頭文件中留出接口,下面先給出便利初始化方法然后在給出便利構造器。

   ?。?)下面的代碼是實體類的便利初始化方法,當然是實例方法,該方法需要傳入一個字典,這個字典中的key就是該實體類的屬性名,值就是要給該實體類的屬性賦的值。并且返回該實體類的實例,簡單的說就是調用-(void) assginToPropertyWithDictionary: (NSDictionary *) data方法,具體代碼如下:

1 - (instancetype)initWithDictionary: (NSDictionary *) data{2     {3         self = [super init];4         if (self) {5              [self assginToPropertyWithDictionary:data];6         }7         return self;8     }9 }

  

   ?。?)下面將要給出便利構造器,當然便利構造器是類方法,并且返回該類的一個實例。用大白話說,便利構造器就是分配內存后調用便利初始化方法然后返回該對象的實例,下方是實體類對應的便利構造器:

1 + (instancetype)modelWithDictionary: (NSDictionary *) data{2     3     return [[self alloc] initWithDictionary:data];4     5 }

 

  五、測試上面的代碼

    上面運行這么多了得運行一下代碼看一下結果吧。因為我們這是基于系統的控制臺程序,所以我們需要在main函數中進行調用我們編寫的方法,需要把我們上面生成的測試字典傳入到實體類的構造器中,并且獲取實體類的一個實例。該獲取的實體類的實例中的屬性就已經被賦值上了傳入的字典的值。具體調用方法如下所示。

1         BeautifulGirlModel *beautifulGirl = [BeautifulGirlModel modelWithDictionary:data];2         3         NSLog(@"%@", beautifulGirl.girl0);

 

  運行結果如下:

 

  使用setValuesForKeysWithDictionary方法賦值,測試代碼如下:

        BeautifulGirlModel *beautifulGirl = [[BeautifulGirlModel alloc] init];        [beautifulGirl setValuesForKeysWithDictionary:data];

 

 

  最后給出最笨的賦值方法,也是最容易學會的賦值方法,不過這種方式維護起來回不太方便,而且大部分做的都是體力活的,實例如下:

1         BeautifulGirlModel *beautifulGirl1 = [[BeautifulGirlModel alloc] init];2         beautifulGirl1.girl0 = data[@"girl0"];3         beautifulGirl1.girl1 = data[@"girl1"];4         beautifulGirl1.girl2 = data[@"girl2"];5         beautifulGirl1.girl3 = data[@"girl3"];6         beautifulGirl1.girl4 = data[@"girl4"];7         beautifulGirl1.girl5 = data[@"girl5"];8         beautifulGirl1.girl6 = data[@"girl6"];9         beautifulGirl1.girl7 = data[@"girl7"];

 

  今天博客中的內容就到這吧,剩下的內容會在下一篇博客中介紹到,下一篇博客的內容的干貨要比這篇博客要足一些。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
狠狠做深爱婷婷久久综合一区| 亚洲区在线播放| 一区二区三区视频在线| 成人h片在线播放免费网站| 久久久99免费视频| 国产精品∨欧美精品v日韩精品| 欧美日韩一区二区精品| 成人福利网站在线观看11| 欧美日韩亚洲一区二区| 欧洲精品在线视频| 国产suv精品一区二区三区88区| 午夜精品久久久久久久99热浪潮| 亚洲欧美在线看| 中文字幕日韩欧美在线视频| 日韩精品视频在线观看免费| 91香蕉电影院| 欧美裸体视频网站| 国产一区二区在线播放| 国产在线视频一区| 欧美日韩激情小视频| 国语自产偷拍精品视频偷| 亚洲免费电影一区| www.久久久久久.com| 国产日本欧美一区| 久久久精品久久久久| 国产精品视频免费在线观看| 伊人一区二区三区久久精品| 亚洲一区二区三区成人在线视频精品| 人人做人人澡人人爽欧美| 亚洲在线免费看| 欧美黄色免费网站| 久久久久久久久久国产精品| 亚洲国产精品成人va在线观看| 国产女精品视频网站免费| 久久精品国产69国产精品亚洲| 一区二区三区黄色| 国产精品一区二区三区在线播放| 日韩国产精品亚洲а∨天堂免| 国精产品一区一区三区有限在线| 国产精品一区=区| 黑人巨大精品欧美一区二区一视频| 成人黄色免费网站在线观看| 亚洲电影第1页| 日本一区二区三区在线播放| 国产精品444| 精品香蕉在线观看视频一| 亚洲精品98久久久久久中文字幕| 日韩第一页在线| 亚洲缚视频在线观看| 亚洲最新av在线网站| 亚洲综合日韩中文字幕v在线| 亚洲日韩欧美视频| 亚洲欧洲高清在线| 在线视频欧美性高潮| 136fldh精品导航福利| 亚洲在线观看视频| 国产精品av在线播放| 日韩欧美高清在线视频| 久久精品国产69国产精品亚洲| 欧美激情精品久久久久久大尺度| 国产综合视频在线观看| 成人美女av在线直播| 亚洲美女av在线| 国产偷亚洲偷欧美偷精品| 成人欧美在线观看| 这里只有精品在线播放| 久久精品福利视频| 久久久91精品国产一区不卡| 久久久免费高清电视剧观看| 精品久久久久久| 国产精品日韩欧美大师| 国产精品专区一| 欧美精品在线观看| 国产精品视频成人| 日韩国产欧美区| 亚洲美女中文字幕| 欧美激情极品视频| 日韩中文字幕在线观看| 欧美高清理论片| 精品国产欧美一区二区五十路| 欧美精品成人在线| 国产日韩av高清| 亚洲精品99久久久久中文字幕| 国产一区二区三区欧美| 4p变态网欧美系列| 久久99久久亚洲国产| 亚洲美女久久久| 精品久久久av| 欧美午夜丰满在线18影院| 欧美电影免费播放| 欧美激情亚洲综合一区| 国产欧美一区二区三区在线看| 亚洲精品videossex少妇| 精品久久久久久久久中文字幕| 欧美日韩性视频| 日韩成人高清在线| 国产99久久精品一区二区永久免费| 欧美一级免费视频| 国产成人免费91av在线| 色偷偷av亚洲男人的天堂| 18一19gay欧美视频网站| 欧美日韩亚洲一区二区| 国产91av在线| 国内揄拍国内精品| 国产va免费精品高清在线观看| 久久久女人电视剧免费播放下载| 欧美日韩国产123| 中文字幕少妇一区二区三区| 国产婷婷成人久久av免费高清| 欧美福利视频在线观看| 国产久一一精品| 国产成人中文字幕| 国产精品中文字幕久久久| 久久影院模特热| 国产精品视频永久免费播放| 国产在线精品成人一区二区三区| 亚洲午夜未删减在线观看| yw.139尤物在线精品视频| 日韩在线观看免费全集电视剧网站| 中文字幕日本精品| 色偷偷av一区二区三区| 久久亚洲国产精品成人av秋霞| 久久免费少妇高潮久久精品99| 欧美老少配视频| 国产美女久久久| 国产欧美一区二区三区四区| 亚洲aⅴ日韩av电影在线观看| 国产大片精品免费永久看nba| 中文字幕av日韩| 奇门遁甲1982国语版免费观看高清| 亚洲午夜av电影| 国产精品视频公开费视频| 国产精品老女人视频| 国产亚洲美女精品久久久| 国产精品久久久久久超碰| 亚洲精品免费网站| 亚洲一二三在线| 少妇av一区二区三区| 庆余年2免费日韩剧观看大牛| 久久视频国产精品免费视频在线| 久久精品国产亚洲精品| 国产a级全部精品| 久久福利视频导航| 久久久久久久激情视频| 久久久人成影片一区二区三区观看| 欧美日韩在线观看视频小说| 欧美大片欧美激情性色a∨久久| 日韩一区二区av| 亚洲午夜激情免费视频| 欧美成人黄色小视频| 91精品国产乱码久久久久久蜜臀| 国产精品国产福利国产秒拍| 九九九热精品免费视频观看网站| 亚洲影院高清在线| 亚洲午夜国产成人av电影男同| 91国产美女视频| 日韩在线观看免费高清完整版| 国产精品亚洲自拍| 亚洲一区二区黄| 欧美专区中文字幕| 国产精品视频专区| 亚洲人成网在线播放| 亚洲区在线播放| 一本一道久久a久久精品逆3p|