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

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

一、獲取Model的實(shí)體屬性

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

///通過運(yùn)行時(shí)獲取當(dāng)前對(duì)象的所有屬性的名稱,以數(shù)組的形式返回

- (NSArray *) allPropertyNames{

///存儲(chǔ)所有的屬性名稱

NSMutableArray *allNames = [[NSMutableArray alloc] init];

///存儲(chǔ)屬性的個(gè)數(shù)

unsigned int propertyCount = 0;

///通過運(yùn)行時(shí)獲取當(dāng)前類的屬性

objc_property_t *propertys = class_copyPropertyList([self class], &propertyCount);

//把屬性放到數(shù)組中

for (int i = 0; i < propertyCount; i ++) {

///取出第一個(gè)屬性

objc_property_t property = propertys[i];

const char * propertyName = property_getName(property);

[allNames addObject:[NSString stringWithUTF8String:propertyName]];

}

///釋放

free(propertys);

return allNames;

}

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

#pragma mark -- 通過字符串來創(chuàng)建該字符串的Setter方法,并返回

- (SEL) creatGetterWithPropertyName: (NSString *) propertyName{

//1.返回get方法: oc中的get方法就是屬性的本身

return NSSelectorFromString(propertyName);

}

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

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

- (void) displayCurrentModleProperty{

//獲取實(shí)體類的屬性名

NSArray *array = [self allPropertyNames];

//拼接參數(shù)

NSMutableString *resultString = [[NSMutableString alloc] init];

for (int i = 0; i < array.count; i ++) {

//獲取get方法

SEL getSel = [self creatGetterWithPropertyName:array[i]];

if ([self respondsToSelector:getSel]) {

//獲得類和方法的簽名

NSMethodSignature *signature = [self methodSignatureForSelector:getSel];

//從簽名獲得調(diào)用對(duì)象

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

//設(shè)置target

[invocation setTarget:self];

//設(shè)置selector

[invocation setSelector:getSel];

//接收返回的值

NSObject *__unsafe_unretained returnValue = nil;

//調(diào)用

[invocation invoke];

//接收返回值

[invocation getReturnValue:&returnValue];

[resultString appendFormat:@"%@\\n", returnValue];

}

}

NSLog(@"%@", resultString);

}

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

BeautifulGirlModel *beautifulGirl = [BeautifulGirlModel modelWithDictionary:data];

[beautifulGirl displayCurrentModleProperty];

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


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

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

#pragma 返回屬性和字典key的映射關(guān)系

-(NSDictionary *) propertyMapDic{

return nil;

}

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

- (instancetype)initWithDictionary: (NSDictionary *) data{

{

self = [super init];

if (self) {

if ([self propertyMapDic] == nil) {

[self assginToPropertyWithDictionary:data];

} else {

[self assginToPropertyWithNoMapDictionary:data];

}

}

return self;

}

}

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

#pragma 根據(jù)映射關(guān)系來給Model的屬性賦值

-(void) assginToPropertyWithNoMapDictionary: (NSDictionary *) data{

///獲取字典和Model屬性的映射關(guān)系

NSDictionary *propertyMapDic = [self propertyMapDic];

///轉(zhuǎn)化成key和property一樣的字典勘畔,然后調(diào)用assginToPropertyWithDictionary方法

NSArray *dicKey = [data allKeys];

NSMutableDictionary *tempDic = [[NSMutableDictionary alloc] initWithCapacity:dicKey.count];

for (int i = 0; i < dicKey.count; i ++) {

NSString *key = dicKey[i];

[tempDic setObject:data[key] forKey:propertyMapDic[key]];

}

[self assginToPropertyWithDictionary:tempDic];

}

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

(1)BadBoyModel的屬性如下:

//

// BadBoyModel.h

// BaseModelProject

//

// Created by Mr.LuDashi on 15/7/24.

// Copyright (c) 2015年 ludashi. All rights reserved.

//

#import "BaseModelObject.h"

@interface BadBoyModel : BaseModelObject

@property (nonatomic, copy) NSString *boy1;

@property (nonatomic, copy) NSString *boy2;

@property (nonatomic, copy) NSString *boy3;

@property (nonatomic, copy) NSString *boy4;

@end

(2)重寫映射方法炫七,映射字典的key是要轉(zhuǎn)換字典的key, Value是對(duì)應(yīng)Model的屬性名爬立。

//

// BadBoyModel.m

// BaseModelProject

//

// Created by Mr.LuDashi on 15/7/24.

// Copyright (c) 2015年 ludashi. All rights reserved.

//

#import "BadBoyModel.h"

@implementation BadBoyModel

#pragma 返回屬性和字典key的映射關(guān)系

-(NSDictionary *) propertyMapDic{

return @{@"keyBoy1":@"boy1",

@"keyBoy2":@"boy2",

@"keyBoy3":@"boy3",

@"keyBoy4":@"boy4",};

}

@end

5.在main函數(shù)中進(jìn)行測(cè)試

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

//生成Dic的Key與Model的屬性不一樣的字典侠驯。

NSMutableDictionary *data1 = [[NSMutableDictionary alloc] init];

//創(chuàng)建測(cè)試適用的字典

for(int i = 1; i <= 4; i ++){

NSString *key = [NSString stringWithFormat:@"keyBoy%d", i];

NSString *value = [NSString stringWithFormat:@"我是第%d個(gè)壞男孩", i];

[data1 setObject:value forKey:key];

}

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

BadBoyModel *badBoyModel = [BadBoyModel modelWithDictionary:data1];

[badBoyModel displayCurrentModleProperty];

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


這是小弟在51上看到的文章粘貼過來希望對(duì)你們有幫助我順便也收藏下來吟策。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市的止,隨后出現(xiàn)的幾起案子檩坚,更是在濱河造成了極大的恐慌,老刑警劉巖诅福,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匾委,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡权谁,警方通過查閱死者的電腦和手機(jī)剩檀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旺芽,“玉大人沪猴,你說我怎么就攤上這事〔烧拢” “怎么了运嗜?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)悯舟。 經(jīng)常有香客問我担租,道長(zhǎng),這世上最難降的妖魔是什么抵怎? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任奋救,我火速辦了婚禮岭参,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尝艘。我一直安慰自己演侯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布背亥。 她就那樣靜靜地躺著秒际,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狡汉。 梳的紋絲不亂的頭發(fā)上娄徊,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音盾戴,去河邊找鬼寄锐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捻脖,可吹牛的內(nèi)容都是我干的锐峭。 我是一名探鬼主播中鼠,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼可婶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了援雇?” 一聲冷哼從身側(cè)響起矛渴,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惫搏,沒想到半個(gè)月后具温,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡筐赔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年铣猩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茴丰。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡达皿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贿肩,到底是詐尸還是另有隱情峦椰,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布汰规,位于F島的核電站汤功,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溜哮。R本人自食惡果不足惜滔金,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一色解、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧餐茵,春花似錦冒签、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肠阱,卻和暖如春票唆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屹徘。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工走趋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人噪伊。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓簿煌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鉴吹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子姨伟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載 使用Runtime給Model類賦值 (前提:字典的Key必須和實(shí)體類的Property Name相同) 一...
    John_LS閱讀 2,435評(píng)論 0 3
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,690評(píng)論 0 9
  • 對(duì)于從事 iOS 開發(fā)人員來說豆励,所有的人都會(huì)答出【runtime 是運(yùn)行時(shí)】什么情況下用runtime?大部分人能...
    夢(mèng)夜繁星閱讀 3,700評(píng)論 7 64
  • 概述 ? iOS源碼解析—YYModel(YYClassInfo)分析了如何根據(jù)OC的Class對(duì)象構(gòu)建...
    egoCogito_panf閱讀 11,545評(píng)論 4 32
  • 讓我留戀的是你溫柔的凝望夺荒,你深深的眼眸中只有我。 你還好嗎良蒸,我的朋友技扼?讓我這樣稱呼你,朋友嫩痰!注定你不會(huì)滯留在我的生...
    海中青閱讀 219評(píng)論 0 2