runtime簡單使用

將字典轉化為模型袁余,面向模型開發(fā)衣陶,是在開發(fā)中最為常用的功能柄瑰。利用KVC可以將字典轉換為模型,但是前提有三個約束剪况,一個是必須保證模型的屬性個數大于等于字典個數教沾,二是屬性名稱與字典的key必須相同,三是對于模型中的基本數據類型無法轉換译断。

其中第一條與第三條授翻,是其最大的弊端。例如孙咪,如果從服務器獲取的數據字典堪唐,并不想使用所有的鍵值對。但是在開發(fā)中還是必須得全部將對應屬性列出翎蹈,全部進行轉換(除非你一個一個寫淮菠,不使用KVC)。

下面的代碼就可以解決上述問題:實現以模型為主荤堪,將字典數據進行部分轉化合陵,并識別基本數據類型。約束僅僅是要求模型屬性名稱與字典KEY保持一致(因為底層還是使用KVC);

//
 2 //  NSObject+Value.m
 3 //
 4 //  Created by Apple 2-2-2016.
 5 //  Copyright (c) 2016年 Apple. All rights reserved.
 6 //
 7 
 8 #import "NSObject+Value.h"
 9 #import <objc/message.h>
10 #import <objc/runtime.h>
11 
12 @implementation NSObject (Value)
13 - (void)setValues:(NSDictionary *)values
14 {
15     Class c = [self class];
16     
17     while (c) {
18         // 1.獲得所有的成員變量
19         unsigned int outCount = 0;
20         Ivar *ivars = class_copyIvarList(c, &outCount);
21 
22         for (int i = 0; i<outCount; i++) {
23             Ivar ivar = ivars[i];
24             
25             // 2.屬性名
26             NSMutableString *name = [NSMutableString stringWithUTF8String:ivar_getName(ivar)];
27             
28             // 刪除最前面的_
29             [name replaceCharactersInRange:NSMakeRange(0, 1) withString:@""];
30             
31             // 3.取出屬性值
32             NSString *key = name;
33             if ([key isEqualToString:@"desc"]) {
34                 key = @"description";
35             }
36             if ([key isEqualToString:@"ID"]) {
37                 key = @"id";
38             }
39             id value = values[key];
40             if (!value) continue;
41             
42             // 4.SEL
43             // 首字母
44             NSString *cap = [name substringToIndex:1];
45             // 變大寫
46             cap = cap.uppercaseString;
47             // 將大寫字母調換掉原首字母
48             [name replaceCharactersInRange:NSMakeRange(0, 1) withString:cap];
49             // 拼接set
50             [name insertString:@"set" atIndex:0];
51             // 拼接冒號:
52             [name appendString:@":"];
53             SEL selector = NSSelectorFromString(name);
54             
55             // 5.屬性類型
56             NSString *type = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)];
57             
58             if ([type hasPrefix:@"@"]) { // 對象類型
59                 objc_msgSend(self, selector, value);
60             } else  { // 非對象類型
61                 if ([type isEqualToString:@"d"]) {
62                     objc_msgSend(self, selector, [value doubleValue]);
63                 } else if ([type isEqualToString:@"f"]) {
64                     objc_msgSend(self, selector, [value floatValue]);
65                 } else if ([type isEqualToString:@"i"]) { 
66                     objc_msgSend(self, selector, [value intValue]);
67                 }  else { 
68                     objc_msgSend(self, selector, [value longLongValue]);
69                 }
70             }
71         }
72         
73         c = class_getSuperclass(c);
74     }
75 }
76 @end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末澄阳,一起剝皮案震驚了整個濱河市拥知,隨后出現的幾起案子,更是在濱河造成了極大的恐慌碎赢,老刑警劉巖低剔,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡襟齿,警方通過查閱死者的電腦和手機姻锁,發(fā)現死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猜欺,“玉大人屋摔,你說我怎么就攤上這事√胬妫” “怎么了钓试?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長副瀑。 經常有香客問我弓熏,道長,這世上最難降的妖魔是什么糠睡? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任挽鞠,我火速辦了婚禮,結果婚禮上狈孔,老公的妹妹穿的比我還像新娘信认。我一直安慰自己,他們只是感情好均抽,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布嫁赏。 她就那樣靜靜地躺著,像睡著了一般油挥。 火紅的嫁衣襯著肌膚如雪潦蝇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天深寥,我揣著相機與錄音攘乒,去河邊找鬼。 笑死惋鹅,一個胖子當著我的面吹牛则酝,可吹牛的內容都是我干的。 我是一名探鬼主播闰集,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼沽讹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了返十?” 一聲冷哼從身側響起妥泉,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤椭微,失蹤者是張志新(化名)和其女友劉穎洞坑,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體蝇率,經...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡迟杂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年刽沾,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片排拷。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡侧漓,死狀恐怖,靈堂內的尸體忽然破棺而出监氢,到底是詐尸還是另有隱情布蔗,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布浪腐,位于F島的核電站纵揍,受9級特大地震影響,放射性物質發(fā)生泄漏议街。R本人自食惡果不足惜泽谨,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望特漩。 院中可真熱鬧吧雹,春花似錦、人聲如沸涂身。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛤售。三九已至龙亲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悍抑,已是汗流浹背鳄炉。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搜骡,地道東北人拂盯。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像记靡,于是被迫代替她去往敵國和親谈竿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內容

  • //我所經歷的大數據平臺發(fā)展史(三):互聯網時代 ? 上篇http://www.infoq.com/cn/arti...
    葡萄喃喃囈語閱讀 51,199評論 10 200
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理摸吠,服務發(fā)現空凸,斷路器,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 對于從事 iOS 開發(fā)人員來說寸痢,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,700評論 7 64
  • 首先介紹一下本文的目錄結構 一.Runtime認識 通常我們向一個類或者對象發(fā)送一個方法如:[object mes...
    hj的簡書閱讀 538評論 0 1
  • 阿高的真名不是阿高呀洲,只不過當我想起這個人時,腦子里就突然蹦出阿高兩個字,再說人名本就不必斤斤計較道逗,所以這里就叫她阿...
    CHEN琛閱讀 821評論 3 8