快速mode賦值

以前我們APP都是使用mj的mode賦值比驻,但是感覺(jué)有點(diǎn)繁瑣该溯,每次都要導(dǎo)入第三方,太過(guò)麻煩别惦,于是到網(wǎng)上查找了一下可以使用的方法狈茉,總結(jié)一下,第一次寫(xiě)掸掸,寫(xiě)的不好請(qǐng)大家原諒啊氯庆。

首先想到的是讀取類(lèi)的屬性名稱(chēng),拿到名稱(chēng)之后扰付,與從后臺(tái)拿到的數(shù)據(jù)進(jìn)行對(duì)比取值堤撵,于是馬上上網(wǎng)查找讀取類(lèi)的屬性名稱(chēng)的方法。代碼如下:

//這個(gè)是一點(diǎn)要導(dǎo)入的不然會(huì)出錯(cuò)

//這個(gè)是一點(diǎn)要導(dǎo)入的不然會(huì)出錯(cuò)

//這個(gè)是一點(diǎn)要導(dǎo)入的不然會(huì)出錯(cuò)

//重要的事情要說(shuō)三遍

#import <objc/runtime.h>

- (NSArray*)attributeArray

{

NSMutableArray*props = [NSMutableArrayarray];

unsignedintoutCount, i;

//讀取所以的屬性信息

objc_property_t*properties =class_copyPropertyList([selfclass], &outCount);

for(i =0; i

{

objc_property_tproperty = properties[i];

constchar* name =property_getName(property);

NSString*propertyName = [NSStringstringWithUTF8String:name];

[propsaddObject:propertyName];

}

free(properties);

returnprops;

}

到這里就可以讀取到所以的所有的屬性名稱(chēng)了羽莺,但是經(jīng)過(guò)測(cè)試發(fā)現(xiàn)粒督,這個(gè)只能讀取到當(dāng)前類(lèi)的屬性名,不可以讀取父類(lèi)的屬性名稱(chēng)禽翼,也就是讀取的屬性名不全,如:


這是一個(gè)父類(lèi)的屬性(請(qǐng)大家忽略屬性命名)


這是子類(lèi)的屬性信息


這是打印出來(lái)的屬性名數(shù)組

這樣的話(huà)雖然也可以進(jìn)行賦值族跛,但是太過(guò)于死板闰挡。

后來(lái)在想,要是反過(guò)來(lái)是不是可以進(jìn)行賦值呢礁哄,讀取字典中所有的key长酗,根據(jù)key進(jìn)行查找屬性名進(jìn)行賦值,于是進(jìn)行了測(cè)試桐绒,發(fā)現(xiàn)這樣的話(huà)可以對(duì)父類(lèi)屬性進(jìn)行賦值夺脾,但是如果字典中存在沒(méi)有聲明的屬性名,在賦值的時(shí)候就會(huì)蹦蹦蹦茉继。

再想一下咧叭,如果可以判斷一下這個(gè)屬性是不是存在那不就可以避免對(duì)沒(méi)有聲明的屬性賦值報(bào)錯(cuò)的問(wèn)題了么,但是怎么查找屬性是否存在呢烁竭?又陷入了一個(gè)難點(diǎn)菲茬。

大家都知道屬性都有兩個(gè)方法的,就是get跟set方法派撕,get方法就是屬性的屬性名婉弹,那能不能根據(jù)一個(gè)字符串轉(zhuǎn)成一個(gè)方法呢,又是一番查找终吼,功夫不負(fù)有心人镀赌,找到了:

//通過(guò)字符串來(lái)創(chuàng)建該字符串的get方法,并返回

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

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

returnNSSelectorFromString(propertyName);

}

然后再進(jìn)行判斷一下這個(gè)get方法是否存在际跪,如果不存在的話(huà)就說(shuō)明沒(méi)有這個(gè)屬性商佛,這樣一來(lái)就解決了對(duì)沒(méi)有聲明的屬性賦值的問(wèn)題了喉钢。

- (void)assignmentInformationQuickly:(NSDictionary*)dictionary

{

NSArray* attributes = dictionary.allKeys;

for(NSString* keyinattributes) {

if([selfrespondsToSelector:[selfnameTransferMethod:key]]) {

[selfsetValue:dictionary[key]forKey:key];

}

?} ?

}

但是這樣的話(huà)會(huì)存在一些值沒(méi)辦法保存下來(lái),可能這些值很重要但是沒(méi)有保存進(jìn)而丟失(如:后臺(tái)返回過(guò)來(lái)的時(shí)候給的key為id威彰,但是不能創(chuàng)建一個(gè)屬性出牧,屬性名為id)。這里又想去一個(gè)可以借鑒的方法歇盼,對(duì)這樣的key進(jìn)行了轉(zhuǎn)換舔痕,中間使用一個(gè)字典進(jìn)行存儲(chǔ)這些對(duì)應(yīng)關(guān)系,想到這就馬上去實(shí)現(xiàn)了豹缀。對(duì)上面的方法做了一下簡(jiǎn)單的修改:

- (void)assignmentInformationQuickly:(NSDictionary*)dictionary

{

NSArray* attributes = dictionary.allKeys;

for(NSString* keyinattributes) {

if([selfrespondsToSelector:[selfnameTransferMethod:key]]) {

[selfsetValue:dictionary[key]forKey:key];

}else{

NSString* newKey =self.propertyMapDic[key];

if([selfrespondsToSelector:[selfnameTransferMethod:newKey]]) {

[selfsetValue:dictionary[key]forKey:newKey];

}

}

}

}

大家看到這個(gè)方法會(huì)不會(huì)迷惑呢伯复?

[selfsetValue:dictionary[key]forKey:key];?

這個(gè)就是根據(jù)屬性名給屬性賦值的一個(gè)方法,可以各種運(yùn)行邢笙。原理類(lèi)似于給字典添加鍵值對(duì)(鍵已存在的那種)啸如,大家可以實(shí)驗(yàn)一下;

最后附上完整代碼:

#import? <Foundation/Foundation.h>

@interfaceNSObject (ZZLModel)

///字典內(nèi)的key都與類(lèi)的屬性名對(duì)應(yīng)可以直接使用

- (instancetype)initWithDictionary:(NSDictionary*)dictionary;

///賦值信息

- (void)assignmentInformationQuickly:(NSDictionary*)dictionary;

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

/**

*如果出現(xiàn)數(shù)據(jù)源的key值與類(lèi)的屬性不對(duì)應(yīng)的情況需要重寫(xiě)get方法如下:

- (NSDictionary *)propertyMapDic

{

if (![super propertyMapDic]) {

self.propertyMapDic = @{@"string7" : @"string6"};

}

return [super propertyMapDic];

}

*屬性與字典key的映射key為數(shù)據(jù)源字典中的key值為類(lèi)里面的屬性名字

*/

@property(nonatomic,strong)NSDictionary* propertyMapDic;

@end

.m

#import"ZZLModel.h"

//這個(gè)是一點(diǎn)要導(dǎo)入的不然會(huì)出錯(cuò)

//這個(gè)是一點(diǎn)要導(dǎo)入的不然會(huì)出錯(cuò)

//這個(gè)是一點(diǎn)要導(dǎo)入的不然會(huì)出錯(cuò)

//重要的事情要說(shuō)三遍

#import<objc/runtime.h>

staticcharconst*constproperty_Map_Dic ="property_Map_Dic";

@implementationNSObject (ZZLModel)

- (instancetype)initWithDictionary:(NSDictionary*)dictionary

{

if(self= [selfinit]) {

[selfassignmentInformationQuickly:dictionary];

//[self printMothList];

}

returnself;

}

- (void)assignmentInformationQuickly:(NSDictionary*)dictionary

{

NSArray* attributes = dictionary.allKeys;

for(NSString* keyinattributes) {

if([selfrespondsToSelector:[selfnameTransferMethod:key]]) {

[selfsetValue:dictionary[key]forKey:key];

}else{

NSLog(@"%@",self.propertyMapDic);

NSString* newKey =self.propertyMapDic[key];

if([selfrespondsToSelector:[selfnameTransferMethod:newKey]]) {

[selfsetValue:dictionary[key]forKey:newKey];

}

}

}

}

- (NSDictionary*)propertyMapDic {

returnobjc_getAssociatedObject(self,property_Map_Dic);

}

- (void)setPropertyMapDic:(id)propertyMapDic {

objc_setAssociatedObject(self,property_Map_Dic, propertyMapDic,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

#pragma mark --通過(guò)字符串來(lái)創(chuàng)建該字符串的Setter方法氮惯,并返回

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

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

returnNSSelectorFromString(propertyName);

}

- (NSArray*)attributeArray

{

NSMutableArray*props = [NSMutableArrayarray];

unsignedintoutCount, i;

//讀取所以的屬性信息

objc_property_t*properties =class_copyPropertyList([selfclass], &outCount);

for(i =0; i

{

objc_property_tproperty = properties[i];

constchar* name =property_getName(property);

NSString*propertyName = [NSStringstringWithUTF8String:name];

[propsaddObject:propertyName];

}

free(properties);

returnprops;

}

/*獲取對(duì)象的所有方法*/

-(void)printMothList

{

unsignedintmothCout_f =0;

Method* mothList_f =class_copyMethodList([selfclass],&mothCout_f);

for(inti=0;i

{

Methodtemp_f = mothList_f[i];

IMPimp_f =method_getImplementation(temp_f);

SELname_f =method_getName(temp_f);

constchar* name_s =sel_getName(method_getName(temp_f));

intarguments =method_getNumberOfArguments(temp_f);

constchar* encoding =method_getTypeEncoding(temp_f);

NSLog(@"方法名:%@,參數(shù)個(gè)數(shù):%d,編碼方式:%@",[NSStringstringWithUTF8String:name_s],

arguments,[NSStringstringWithUTF8String:encoding]);

}

free(mothList_f);

}

這里面是寫(xiě)的一個(gè)類(lèi)目叮雳,一個(gè)NSObject的類(lèi)目。

如果出現(xiàn)上面說(shuō)的那種一些重要屬性沒(méi)辦法存儲(chǔ)妇汗,可以在mode中重新propertyMapDic的get方法帘不,如下:

- (NSDictionary*)propertyMapDic

{

if(![super propertyMapDic]) {

self.propertyMapDic=@{@"string7":@"string6"};

}

return[super propertyMapDic];

}

下面是我的實(shí)驗(yàn):


string7沒(méi)有這個(gè)屬性的,一定要記住


成功啦 ? ?哈哈哈

就到這里了 ?謝謝大家杨箭;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寞焙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子互婿,更是在濱河造成了極大的恐慌捣郊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慈参,死亡現(xiàn)場(chǎng)離奇詭異呛牲,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)懂牧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)侈净,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人僧凤,你說(shuō)我怎么就攤上這事畜侦。” “怎么了躯保?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵旋膳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我途事,道長(zhǎng)验懊,這世上最難降的妖魔是什么擅羞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮义图,結(jié)果婚禮上减俏,老公的妹妹穿的比我還像新娘。我一直安慰自己碱工,他們只是感情好娃承,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著怕篷,像睡著了一般历筝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上廊谓,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天梳猪,我揣著相機(jī)與錄音,去河邊找鬼蒸痹。 笑死春弥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叠荠。 我是一名探鬼主播惕稻,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝙叛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起公给,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤借帘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后淌铐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肺然,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年腿准,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了际起。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吐葱,死狀恐怖街望,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弟跑,我是刑警寧澤灾前,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站孟辑,受9級(jí)特大地震影響哎甲,放射性物質(zhì)發(fā)生泄漏蔫敲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一炭玫、第九天 我趴在偏房一處隱蔽的房頂上張望奈嘿。 院中可真熱鬧,春花似錦吞加、人聲如沸裙犹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伯诬。三九已至,卻和暖如春巫财,著一層夾襖步出監(jiān)牢的瞬間盗似,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工平项, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赫舒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓闽瓢,卻偏偏與公主長(zhǎng)得像接癌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扣讼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉缺猛,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,679評(píng)論 0 9
  • Question Find the total area covered by two rectilinear r...
    FlynnLWang閱讀 166評(píng)論 0 0
  • 舞動(dòng)與呼吸冥想篇:今天的舞動(dòng)不再是一個(gè)人,約了朋友一起椭符,通過(guò)雙人舞動(dòng)的過(guò)程中從朋友身上看到曾經(jīng)的自己:軟弱荔燎、無(wú)力、...
    妙妙與美燕閱讀 293評(píng)論 0 0
  • 決定人生的走向的就那么幾步:去哪個(gè)城市销钝,選什么行業(yè)有咨,去哪家公司,跟什么人交往蒸健,和誰(shuí)結(jié)婚…… 關(guān)鍵環(huán)節(jié)的決策深刻影響...
    kelvin2068閱讀 701評(píng)論 0 1