国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

iOS開發之遍歷Model類的屬性并完善使用Runtime給Model類賦值

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

  在上篇博客iOS開發之使用Runtime給Model類賦值》中介紹了如何使用運行時在實體類的基類中添加給實體類的屬性賦值的方法,這個方法的前提是字典的Key必須和實體類的PRoperty Name相同,然后通過運行時來生成和執行Setter方法給Model類的屬性賦值。

  通過Runtime來給Model類屬性賦值的好處是多多的,它便于代碼的后期維護,并且提高了開發效率。當你拿到解析后的字典時你不用一個一個的通過key去把字典的值賦值給相應的Model類的屬性,本篇博客中會給出如何去遍歷Model中屬性的值,并且給出字典的Key和Model的屬性名不一樣的情況我們該如何負值。

  接下來會在上一個博客代碼基礎上在Model基類中添加通過Runtime來遍歷Model類的屬性值。

  一、獲取Model的實體屬性

  1.要想遍歷Model類的屬性,首先得通過Runtime來獲取該Model類有哪些屬性,輸出Model的所有屬性的值可不像遍歷Dictionary和Array那樣一個for循環搞定的,下面的方法是通過Runtime來獲取Model類的屬性字符串,并以數組的形式返回。代碼如下:

 1 ///通過運行時獲取當前對象的所有屬性的名稱,以數組的形式返回 2 - (NSArray *) allPropertyNames{ 3     ///存儲所有的屬性名稱 4     NSMutableArray *allNames = [[NSMutableArray alloc] init]; 5      6     ///存儲屬性的個數 7     unsigned int propertyCount = 0; 8      9     ///通過運行時獲取當前類的屬性10     objc_property_t *propertys = class_copyPropertyList([self class], &propertyCount);11     12     //把屬性放到數組中13     for (int i = 0; i < propertyCount; i ++) {14         ///取出第一個屬性15         objc_property_t property = propertys[i];16         17         const char * propertyName = property_getName(property);18         19         [allNames addObject:[NSString stringWithUTF8String:propertyName]];20     }21     22     ///釋放23     free(propertys);24     25     return allNames;26 }

 

  2.獲取到Model類的屬性方法后需要把屬性字符串生成get方法,我們可以執行get方法來獲取Model屬性的值,下方的方法是根據屬性字符串來獲取屬性的getter方法,OC中屬性的getter方法的名字和屬性的名字是一致的,生成getter方法比較簡單,具體代碼如下:

1 #pragma mark -- 通過字符串來創建該字符串的Setter方法,并返回2 - (SEL) creatGetterWithPropertyName: (NSString *) propertyName{3     4     //1.返回get方法: oc中的get方法就是屬性的本身5     return NSSelectorFromString(propertyName);6 }

 

  二、Get方法的執行

    接下來要做的是通過Runtime來執行Getter方法,這一塊需要通過方法的簽名來執行Getter方法。在OC的運行時中要執行的方法需要傳入參數或者需要接收返回值時,需要通過方法的簽名來調用方法。下面的代碼就是創建方法的簽名,然后通過簽名來獲取調用的對象,在下邊的方中回調用上述兩個方法在通過方法的簽名來獲取Model屬性的值,具體代碼如下:

 1 - (void) displayCurrentModleProperty{ 2      3     //獲取實體類的屬性名 4     NSArray *array = [self allPropertyNames]; 5   6     //拼接參數 7     NSMutableString *resultString = [[NSMutableString alloc] init]; 8      9     for (int i = 0; i < array.count; i ++) {10         11         //獲取get方法12         SEL getSel = [self creatGetterWithPropertyName:array[i]];13         14         if ([self respondsToSelector:getSel]) {15             16             //獲得類和方法的簽名17             NSMethodSignature *signature = [self methodSignatureForSelector:getSel];18 19             //從簽名獲得調用對象20             NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];21 22             //設置target23             [invocation setTarget:self];24             25             //設置selector26             [invocation setSelector:getSel];27 28             //接收返回的值29             NSObject *__unsafe_unretained returnValue = nil;30 31             //調用32             [invocation invoke];33 34             //接收返回值35             [invocation getReturnValue:&returnValue];36 37             [resultString appendFormat:@"%@/n", returnValue];38         }39     }40     NSLog(@"%@", resultString);41     42 }

 

  執行上述方法就可以輸入Model中的屬性的值,下面就在main函數中對Model賦完值后調用上述方法輸出一下Model的屬性值,調用代碼如下所示:

1         BeautifulGirlModel *beautifulGirl = [BeautifulGirlModel modelWithDictionary:data];2         3         [beautifulGirl displayCurrentModleProperty];

  

  運行結果如下,下面的輸出結果是Model中屬性的值。

 

  三、Dictionary的Key與Model的屬性不同的處理方式

    有時候會遇到字典的key和Model的屬性不一樣的情況,那么如何去解決這個問題呢?最簡單的做法是在具體的實體類中去維護一個映射關系方法,通過這個方法我們可以獲取相應的的映射關系。

    1.在Model的基類中添加一個返回映射字典的一個方法,然后在子類中進行重寫,這個映射方法在基類中返回nil, 如果子類需要重寫的話就對這個方法進行重寫并返回映射字典。方法如下:

1 #pragma 返回屬性和字典key的映射關系2 -(NSDictionary *) propertyMapDic{3     return nil;4 }

 

  2.修改一下我們的便利初始化方法,在有映射字典的情況和沒有映射字典的情況下調用的方法是不一樣的,便利初始化方法的代碼如下:

 1 - (instancetype)initWithDictionary: (NSDictionary *) data{ 2     { 3         self = [super init]; 4         if (self) { 5             if ([self propertyMapDic] == nil) { 6                 [self assginToPropertyWithDictionary:data]; 7             } else { 8                 [self assginToPropertyWithNoMapDictionary:data]; 9             }10         }11         return self;12     }13 }

 

  3.接下來就將實現有映射關系要調用的方法,這個方法就是通過映射關系把字典的key轉換成與property的名字一樣的字典,然后調用之前的賦值方法,具體代碼如下:

 1 #pragma 根據映射關系來給Model的屬性賦值 2 -(void) assginToPropertyWithNoMapDictionary: (NSDictionary *) data{ 3     ///獲取字典和Model屬性的映射關系 4     NSDictionary *propertyMapDic = [self propertyMapDic]; 5      6     ///轉化成key和property一樣的字典,然后調用assginToPropertyWithDictionary方法 7      8     NSArray *dicKey = [data allKeys]; 9 10     11     NSMutableDictionary *tempDic = [[NSMutableDictionary alloc] initWithCapacity:dicKey.count];12     13     for (int i = 0; i < dicKey.count; i ++) {14         NSString *key = dicKey[i];15         [tempDic setObject:data[key] forKey:propertyMapDic[key]];16     }17     18     [self assginToPropertyWithDictionary:tempDic];19     20 }

 

  4.創建一個BadBoyModel, 并重寫propertyMapDic方法,并且在propertyMapDic方法中給出映射關系并返回該映射關系對應的字典。

    (1)BadBoyModel的屬性如下:

 1 // 2 //  BadBoyModel.h 3 //  BaseModelProject 4 // 5 //  Created by Mr.LuDashi on 15/7/24. 6 //  Copyright (c) 2015年 ludashi. All rights reserved. 7 // 8  9 #import "BaseModelObject.h"10 11 @interface BadBoyModel : BaseModelObject12 13 @property (nonatomic, copy) NSString *boy1;14 @property (nonatomic, copy) NSString *boy2;15 @property (nonatomic, copy) NSString *boy3;16 @property (nonatomic, copy) NSString *boy4;17 18 @end

 

    (2)重寫映射方法,映射字典的key是要轉換字典的key, Value是對應Model的屬性名。

 1 // 2 //  BadBoyModel.m 3 //  BaseModelProject 4 // 5 //  Created by Mr.LuDashi on 15/7/24. 6 //  Copyright (c) 2015年 ludashi. All rights reserved. 7 // 8  9 #import "BadBoyModel.h"10 11 @implementation BadBoyModel12 13 #pragma 返回屬性和字典key的映射關系14 -(NSDictionary *) propertyMapDic{15     return @{@"keyBoy1":@"boy1",16              @"keyBoy2":@"boy2",17              @"keyBoy3":@"boy3",18              @"keyBoy4":@"boy4",};19 }20 21 @end

 

    5.在main函數中進行測試

      (1)、生成我們的數值字典,字典的key與要賦值Model的屬性不同,下面的循環就是要生成測試使用的數據:

 1        //生成Dic的Key與Model的屬性不一樣的字典。 2          3         NSMutableDictionary *data1 = [[NSMutableDictionary alloc] init]; 4          5         //創建測試適用的字典 6         for(int i = 1; i <= 4; i ++){ 7             NSString *key = [NSString stringWithFormat:@"keyBoy%d", i]; 8              9             NSString *value = [NSString stringWithFormat:@"我是第%d個壞男孩", i];10             11             [data1 setObject:value forKey:key];12         }

 

      (2) 實例化Model并輸出結果,當然之前的代碼也是可以使用的。

1         BadBoyModel *badBoyModel = [BadBoyModel modelWithDictionary:data1];2         3         [badBoyModel displayCurrentModleProperty];

 

    運行輸出結果如下:

  

 

    今天博客就到這,至此,Model的基類最基本的方法封裝的也就差不多了,根據具體需求可以在添加新的方法


上一篇:Mac命令

下一篇:StanfordiOSLearnNotes-1

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐都县| 长宁县| 印江| 保德县| 永修县| 德令哈市| 屯昌县| 平乐县| 安化县| 桐梓县| 玛纳斯县| 西丰县| 无锡市| 沈阳市| 永清县| 合阳县| 东方市| 荃湾区| 威海市| 襄城县| 阳泉市| 夹江县| 钟山县| 武清区| 赣榆县| 武强县| 甘谷县| 鄂尔多斯市| 马关县| 高雄市| 定西市| 东乌| 南岸区| 曲松县| 乌恰县| 浦县| 平远县| 锡林浩特市| 肇庆市| 外汇| 天津市|