自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[144431]]

一、獲取Model的實體屬性

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

  1. ///通過運行時獲取當(dāng)前對象的所有屬性的名稱,以數(shù)組的形式返回 
  2. - (NSArray *) allPropertyNames{ 
  3. ///存儲所有的屬性名稱 
  4. NSMutableArray *allNames = [[NSMutableArray alloc] init]; 
  5.  
  6. ///存儲屬性的個數(shù) 
  7. unsigned int propertyCount = 0
  8.  
  9. ///通過運行時獲取當(dāng)前類的屬性 
  10. objc_property_t *propertys = class_copyPropertyList([self class], &propertyCount); 
  11.  
  12. //把屬性放到數(shù)組中 
  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. free(propertys); 
  23.  
  24. return allNames; 

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

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

二、Get方法的執(zhí)行

接下來要做的是通過Runtime來執(zhí)行Getter方法,這一塊需要通過方法的簽名來執(zhí)行Getter方法。在OC的運行時中要執(zhí)行的方法需要傳入?yún)?shù)或者需要接收返回值時,需要通過方法的簽名來調(diào)用方法。下面的代碼就是創(chuàng)建方法的簽名,然后通過簽名來獲取調(diào)用的對象,在下邊的方中回調(diào)用上述兩個方法在通過方法的簽名來獲取Model屬性的值,具體代碼如下:

  1. - (void) displayCurrentModleProperty{ 
  2.  
  3. //獲取實體類的屬性名 
  4. NSArray *array = [self allPropertyNames]; 
  5.  
  6. //拼接參數(shù) 
  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. //從簽名獲得調(diào)用對象 
  20. NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
  21.  
  22. //設(shè)置target 
  23. [invocation setTarget:self]; 
  24.  
  25. //設(shè)置selector 
  26. [invocation setSelector:getSel]; 
  27.  
  28. //接收返回的值 
  29. NSObject *__unsafe_unretained returnValue = nil; 
  30.  
  31. //調(diào)用 
  32. [invocation invoke]; 
  33.  
  34. //接收返回值 
  35. [invocation getReturnValue:&returnValue]; 
  36.  
  37. [resultString appendFormat:@"%@\n", returnValue]; 
  38. NSLog(@"%@", resultString); 
  39.  

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

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

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

 

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

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

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

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

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

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

  1. #pragma 根據(jù)映射關(guān)系來給Model的屬性賦值 
  2. -(void) assginToPropertyWithNoMapDictionary: (NSDictionary *) data{ 
  3. ///獲取字典和Model屬性的映射關(guān)系 
  4. NSDictionary *propertyMapDic = [self propertyMapDic]; 
  5.  
  6. ///轉(zhuǎn)化成key和property一樣的字典,然后調(diào)用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. [self assginToPropertyWithDictionary:tempDic]; 
  18.  

4.創(chuàng)建一個BadBoyModel, 并重寫propertyMapDic方法,并且在propertyMapDic方法中給出映射關(guān)系并返回該映射關(guān)系對應(yīng)的字典。

(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 : BaseModelObject 
  12.  
  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是要轉(zhuǎn)換字典的key, Value是對應(yīng)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 BadBoyModel 
  12.  
  13. #pragma 返回屬性和字典key的映射關(guān)系 
  14. -(NSDictionary *) propertyMapDic{ 
  15. return @{@"keyBoy1":@"boy1"
  16. @"keyBoy2":@"boy2"
  17. @"keyBoy3":@"boy3"
  18. @"keyBoy4":@"boy4",}; 
  19.  
  20. @end 

5.在main函數(shù)中進行測試

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

  1. //生成Dic的Key與Model的屬性不一樣的字典。 
  2.  
  3. NSMutableDictionary *data1 = [[NSMutableDictionary alloc] init]; 
  4.  
  5. //創(chuàng)建測試適用的字典 
  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]; 

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

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

運行輸出結(jié)果如下:

 

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

作者:青玉伏案

出處:http://www.cnblogs.com/ludashi/

責(zé)任編輯:chenqingxiang 來源: 青玉伏案的博客
相關(guān)推薦

2015-08-06 15:13:49

runtimeIOS開發(fā)

2013-10-31 13:37:07

CloudaAPI手冊

2016-04-11 09:58:53

iOSJSONModel

2021-04-26 10:01:25

JavaJava基礎(chǔ)Runtime

2011-07-22 16:15:11

IOS 靜態(tài)類

2014-07-17 10:06:02

Model-View-iOS App

2022-09-30 11:08:44

MySQLPostgreSQLOracle

2013-07-29 05:11:38

iOS開發(fā)iOS開發(fā)學(xué)習(xí)類的'生命周期'

2011-08-17 14:20:21

IOS開發(fā)GraphicsCon

2013-07-24 18:22:02

iOS開發(fā)學(xué)習(xí)iOS開源框架和類

2022-12-18 19:49:45

AI

2016-09-23 10:20:22

JUnit擴展模型Extension

2014-05-13 10:12:17

iOS開發(fā)開源類庫

2014-04-23 13:30:23

類簇iOS開發(fā)

2016-03-24 11:26:21

runtime成員變量屬性

2014-12-02 10:02:21

Android異步任務(wù)

2013-05-20 17:21:34

2009-07-10 10:08:59

Spinner ModSwing組件

2009-08-05 18:32:28

HtmlTextWriASP.NET控件開發(fā)

2021-12-21 08:51:13

Go數(shù)據(jù)Model
點贊
收藏

51CTO技術(shù)棧公眾號