[iOS 開發(fā)基礎(chǔ)]- 字典轉(zhuǎn)模型和KVC

需求一:將字典轉(zhuǎn)換成自己需的對象,對象的屬性是字典的key值,直接使用key值獲取數(shù)據(jù)存在兩個缺點,一是key值難以記憶,二是直接使用key值Xcode不會有智能提示,很容易導(dǎo)致未知的錯誤。使用模型時,可以直接通過點語法將需要的數(shù)據(jù)點出,保證數(shù)據(jù)準確無誤。使用模型的優(yōu)點還在于存儲、傳值都比較方便,不容易出錯。最主要的是這也符合我們MVC和MVVM的設(shè)計模式。

注意:要使用模型就離不開KVC,假如我們從外界傳入一個字典,字典中有兩個 key對應(yīng)的值是我們需要的,這兩個值分別是 “name”、“age”。要使用KVC的時候要注意模型的屬性一定要和字典中的key值相對應(yīng)。比如字典中的“name”,那模型中就必須有一個name的屬性。這樣就可以使用KVC了,KVC的兩種方法:(下文都默認我們有兩個模型屬性,分別是name和age,傳入的字典默認為dict)

1.?setValue(模型屬性, forKey:字典的key值)

eg:setValue(self.name, forKey:dict[“name”])

*這種賦值方法很麻煩,每需要一個key值就要打一遍該方法。這樣的賦值方式就和self.name = dict[“name”] 的區(qū)別不是太大

2.?setValuesForKeysWithDictionary(傳入的字典)

eg:?setValuesForKeysWithDictionary(dict)

*直接完成賦值,其實setValuesForKeysWithDictionary(傳入的字典),它默認也是調(diào)用setValue(模型屬性, forKey:字典的key值 ),遍歷字典一一給模型屬性賦值。所以使用KVC時就要求模型的屬性必須喝字典的key值一一對應(yīng)。

需求二:如果我們只想使用字典中的部分值呢?一個大字典,里面有好幾十個key,難道我們還要在模型中根據(jù)key值定義幾十個屬性么?當然我們程序猿都是很懶的,肯定不會定義這么多key值的,此時我們只需重寫KVC的以下方法就行了:

3.setValue(value: AnyObject?, forUndefinedKey key: String)

*這個方法會幫我們過濾我們沒有的key值,值執(zhí)行 setValuesForKeysWithDictionary(dict)時,當監(jiān)測出我們沒有字典中key值所對應(yīng)的屬性時就會調(diào)用這個方法。

*重寫時里面不需要寫任何代碼,如果想打印哪些key值我們沒有時就可以在里面打印。

需求三:我們知道很多字典中都有“id”這個key值。而“id”在我們iOS中是個數(shù)據(jù)類型,顯然不能將“id”當作模型屬性名稱去定義。此時我們只需要隨意定義一個屬性名去保存“id”,當然為了更已讀、嚴謹一些,我們一般還是定義為“ID”最為恰當。而我們知道要使用KVC就要key值和模型名一一對應(yīng),但是我們就是想要獲取“id”。此時需要將“需求一”和“需求二”結(jié)合起來看了。我們在獲取“id”時,直接使用傳入的字典賦值:(此時我們新添一個屬性“ID”)

eg :self.ID = dict[“id”]

*當這樣賦值之后就取出”id “所對應(yīng)的value了。

但是我們還要獲取其他的value呢,此時在使用 setValuesForKeysWithDictionary(dict)完成其他屬性的賦值。當然也需要重寫setValue(value:?AnyObject?, forUndefinedKey key:?String)方法,因為字典中并有“ID”這個key值(字典中是“id”,“ID”是模型新定義的屬性)。完整代碼如下 :

swift:

override init() {

super.init()

self.ID =?dict[@"id”];

setValuesForKeysWithDictionary(dict)

}

override func setValue(value: AnyObject?, forUndefinedKey key: String) { }

OC:

+ (instancetype) testWithDict:(NSDictionary *)dict{

TEST?*test = [[TEST?alloc]init];

test.ID = dict[@"id"];

[test?setValuesForKeysWithDictionary:dict];

return?test;

}

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{

}

*注意當在對象方法使用KVC時一定要先super.init,因為要首先保證有一個對象存在,這樣才能訪問這個對象的屬性。

*注意在使用對象方法時,命名方法名時“With”中的“W”必須大寫,否則無法完成super.init

eg:- (instancetype) initWithDict:(NSDictionary?*)dict

補充:KVC強大不僅僅只在于給模型賦值,KVC還可給只讀 屬性賦值,改變私有屬性。比如UITabBarController中tabBar是只讀屬性,用一般的賦值時無法給只讀屬性賦值的,但是通過

setValue(value,forKey:”屬性名”)

eg:setValue(value,forKey:“tabBar”)

總結(jié):KVC是Set Value Coding的簡稱,它是一種直接通過字符串的名字(key)來訪問類屬性的機制。而不是通過Setter(設(shè)置器)和Getter(讀取器)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

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