亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

IOS高級開發KVC(一)

2019-11-14 19:11:21
字體:
來源:轉載
供稿:網友

  熟練使用KVC 可以再開發過程中可以給我們帶來巨大的好處,尤其是在json 轉模型的時候,KVC讓程序員擺脫了繁瑣無營養的代碼堆積。減少代碼量就是減少出錯的概率。KVC 用起來很靈活,這種靈活的基礎是嚴格的命名要求。這種命名要求其實是一種約定。再程序的世界里,約定的作用遠遠大于開發本身,良好的約定可以使程序員擺脫很多判斷,也減少了錯誤。KVC有如下幾點作用:

1)、直接賦值

使用KVC 可以對對象的某個屬性進行賦值。假定現在我們有一個Person 類,類中包含兩個屬性:一個是只讀的name 屬性,一個是Number類型的age屬性。

////  Person.h//  KVC////  Created by 鄧竹立 on 15-4-24.//  Copyright (c) 2015年 GiveMeFive. All rights reserved.//#import <Foundation/Foundation.h>@interface Person : NSObject@PRoperty(nonatomic,copy,readonly)NSString* name;@property(nonatomic,assign)NSNumber *age;@end

當我們定義了屬性的時候,系統就為我們自動的生成了setter 和getter 方法。我們可以通過setter 和getter方法,或讀取或寫入數值。當然我們也可以用KVC 的方式進行讀寫數據。先看一下代碼,然后我們再簡述一下需要注意的問題。

#import "ViewController.h"#import "Person.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad{    [super viewDidLoad];        Person *person=[[Person alloc] init];        [person setValue:@"25" forKey:@"age"];    [person setValue:@"皮拉夫大王" forKey:@"name"];        NSLog(@"person 的名字是%@",person.name);    NSLog(@"person 的年領是%@",[person valueForKey:@"age"]);}@end

2015-04-24 20:40:13.286 KVC[6208:218095] person 的名字是皮拉夫大王

2015-04-24 20:40:13.287 KVC[6208:218095] person 的年領是25

如果你沒有接觸過KVC 的話,你大概會想:我擦,大王的腦子壞掉了吧?只讀的屬性怎么可以賦值?!還有age屬性明明是NSNumber類型的,怎么可以把字符串賦給它?!沒錯,這就是我想說的,KVC 不但能夠賦值,而且還能破壞只讀的特性。當然這只是我們需要注意的一個細節,更重要的是KVC 有自動裝箱(自動類型轉換)的功能,我們不需要去轉換類型了。由于開發過程中數據領域是字符串的天下,所以這個自動裝箱的功能的確是極好的。

2)、支持鍵值路徑

什么叫支持鍵值路徑?說白了就是支持嵌套。假如現在有一個書籍類,類中包含了書籍的名稱name。書籍可以被Person所擁有(就是可以作為person的屬性)

#import <Foundation/Foundation.h>@interface Book : NSObject@property(nonatomic,copy)NSString* name;@end

那么我們就可以這樣來用

    Person *person=[[Person alloc] init];    Book *myBook=[[Book alloc] init];    person.book=myBook;        [person setValue:@"程序員攤煎餅指南" forKeyPath:@"book.name"];        NSLog(@"%@",[person valueForKeyPath:@"book.name"]);

這里的key直接使用點局分開就好了,注意一下:這里使用的時keyPath,當然在   “ 1)屬性賦值”   中我們也可以使用keyPath,只不過再不必要的情況下使用keyPath會浪費性能而已。這里沒啥可說的了,說多了都對不起我一度5毛的電費。

3)支持操作符

假如我們有10個字符串,我們想求出這10個字符串的總長度,我們可以使用KVC提供的操作符。

NSArray *books=@[@"鳥哥燒烤私房菜",@"程序員攤煎餅寶典",@"麻辣燙基礎教程"];NSLog(@"%@",[books valueForKeyPath:@"@sum.length"]);

這里的@sum 是KVC 提供的,不是我們寫的。像這樣的函數共有5個@avg,@count,@max,@min,@sum。我們直接用就可以了。但是據說效率比用for循環慢。我沒有測試過,感興趣的話你可以測試一下。

4)錯誤攔截

對于我們前端程序員來說,后端程序員有時也是一個troubleMaker。他總是給你傳遞一些很奇怪的東西。比如給你傳遞一個id 屬性,或者什么都不給你傳。如果有這樣一個json文件 {“id”:"1"}。這是逼著我們把id作為數據模型的一個屬性的節奏?。?!老夫不愿意??!盡管作為屬性也不會報錯。屈服?還是抗爭?這是一個問題。但是好在前輩們已經給了我們答案。假如我們有一個Model類,類中的whoCare屬性就是本應命名為id 的屬性。我們還寫了一個字典轉模型的初始化方法。

@interface Model : NSObject@property(nonatomic,strong)id whoCare;-(instancetype)initWithDict:(NSDictionary *)dict;@end

 

那么我們可以在.m文件中重寫 -(void)setValue:(id)value forUndefinedKey:(NSString *)key 方法。這個方法會在字典轉模型時,系統找不到同名的屬性時調用。所以我們可以再這個方法中進行錯誤攔截,并進行賦值操作,這樣就不會報錯了。

#import "Model.h"@implementation Model-(instancetype)initWithDict:(NSDictionary *)dict{    if (self=[super init])    {        //忘了介紹了 字典轉模型的常用語句        [self setValuesForKeysWithDictionary:dict];    }    return self;}-(void)setValue:(id)value forUndefinedKey:(NSString *)key{    if ([key isEqualToString:@"id"])    {        self.whoCare=value;    }}@end

寫好了模型類,我們可以來測試一下。

#import "Model.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad{    [super viewDidLoad];    NSDictionary *dict=@{@"id":@"1"};        Model *model=[[Model alloc] initWithDict:dict];        NSLog(@"%@",model.whoCare);}@end

程序沒有崩潰,而且賦值成功。不信你看打印信息

2015-04-24 21:12:00.676 KVC[6393:228807] 1

 

 


上一篇:類的本質

下一篇:jsonj解析網絡數據

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久国产精彩视频| 91在线免费观看网站| 日本一区二区不卡| 亚洲一级黄色av| 亚洲欧洲国产伦综合| 国产在线精品自拍| 成人激情视频在线播放| 91在线直播亚洲| 国产成人免费91av在线| 日韩国产在线播放| 亚洲免费伊人电影在线观看av| 日韩av成人在线| 久久亚洲精品小早川怜子66| 国产精品精品国产| 亚洲精品国产精品国自产观看浪潮| 久久精品中文字幕电影| 亚洲国产精品va在线观看黑人| 在线日韩欧美视频| 91精品国产乱码久久久久久蜜臀| 久久久久亚洲精品成人网小说| 91最新在线免费观看| 久久精品国亚洲| 欧美国产在线视频| 日韩美女主播视频| 欧美日韩亚洲一区二区三区| 91精品国产91久久久久| 亚洲第一视频在线观看| 日韩av大片免费看| 国产精品视频一区二区高潮| 日本高清久久天堂| 国产精品久久久精品| 日韩精品福利在线| 中文字幕精品国产| 国产精品揄拍500视频| 国产精品成人一区| 欧洲亚洲妇女av| 久久久亚洲欧洲日产国码aⅴ| 亚洲精品国精品久久99热| 97视频在线观看免费| 亚洲摸下面视频| 欧美亚洲一区在线| 91精品国产高清自在线| 久久久久久久久久久av| 精品国产一区二区三区久久久| 精品国内亚洲在观看18黄| 一本色道久久88综合亚洲精品ⅰ| 久99久在线视频| 亚洲国产成人精品女人久久久| 日韩视频―中文字幕| 另类图片亚洲另类| 亚洲天堂成人在线| 欧美高清视频免费观看| 国产成人精品综合久久久| 久久深夜福利免费观看| 成人免费xxxxx在线观看| 日韩av三级在线观看| 国产精品第一第二| 成人日韩av在线| 国内精品久久久久久久久| 自拍偷拍免费精品| 日韩av手机在线看| 日韩欧美成人精品| 91亚洲精品一区| 欧美韩国理论所午夜片917电影| 视频在线一区二区| 精品性高朝久久久久久久| 国产一区二区三区18| www国产精品com| 亚洲成人精品久久久| 国产免费一区视频观看免费| 91久久精品国产91性色| 成人免费视频在线观看超级碰| 国产精品h片在线播放| 成人性生交大片免费看小说| 成人信息集中地欧美| 91国产高清在线| 中文字幕免费精品一区高清| 亚洲欧美精品suv| 亚洲国产欧美一区二区三区久久| 91久久精品国产91性色| 少妇久久久久久| 国产精品久久久久久超碰| 亚洲国产成人精品女人久久久| 精品人伦一区二区三区蜜桃网站| 精品一区二区亚洲| 成人福利网站在线观看| 日韩在线视频导航| 久久影院免费观看| 奇米成人av国产一区二区三区| 成人福利网站在线观看| 欧美视频国产精品| 亚洲欧美在线免费观看| 国产伊人精品在线| 在线观看欧美视频| 俺也去精品视频在线观看| 欧美成人国产va精品日本一级| 亚洲一区二区三区777| 91精品久久久久久久| 亚洲高清av在线| 久久99精品久久久久久噜噜| 精品一区二区三区四区| 中文字幕日韩av电影| 91精品国产网站| 国产丝袜一区二区三区免费视频| 国产一区二区日韩| 久久精品亚洲94久久精品| 91精品国产777在线观看| 在线播放日韩专区| 另类美女黄大片| 91麻豆国产语对白在线观看| 日韩精品小视频| 精品国产一区二区三区在线观看| 国产精品盗摄久久久| 亚洲午夜精品视频| 亚洲人成欧美中文字幕| 日韩在线视频线视频免费网站| 亚洲国产一区二区三区四区| 欧美日韩国内自拍| 亚洲国产私拍精品国模在线观看| 欧美大片va欧美在线播放| 2019中文在线观看| 福利视频导航一区| 色阁综合伊人av| 国产午夜精品视频免费不卡69堂| 国产精品视频网| 久久69精品久久久久久久电影好| 欧美整片在线观看| 亚洲福利精品在线| 国产精品成人av性教育| 欧美日韩综合视频| 国产区亚洲区欧美区| 亚洲美腿欧美激情另类| 国产男女猛烈无遮挡91| 欧美激情精品久久久久久久变态| 欧美性感美女h网站在线观看免费| 欧美成人在线免费| 最近2019年日本中文免费字幕| 亚洲视频在线观看网站| 国产成人拍精品视频午夜网站| 久久精品视频在线| 最近2019中文免费高清视频观看www99| 精品久久久久久国产| 美女精品视频一区| 欧美日韩一区二区免费视频| 国产aⅴ夜夜欢一区二区三区| 亚洲欧美另类在线观看| 国外成人在线播放| 日韩精品在线视频观看| 91国内揄拍国内精品对白| 欧美日在线观看| 欧美激情久久久久| 国产亚洲精品久久久久久777| 奇米成人av国产一区二区三区| 欧美日韩国产第一页| 国产精品高潮呻吟久久av黑人| 亚洲国产91色在线| 国内精品久久久久久中文字幕| 欧美日韩国产专区| 插插插亚洲综合网| 日韩a**站在线观看| 国产综合在线观看视频| 国产精品99久久久久久www| 欧美影院成年免费版| 国产剧情日韩欧美|