麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

IOS高級開發(fā)KVC(一)

2019-11-14 19:11:21
字體:
供稿:網(wǎng)友

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

1)、直接賦值

使用KVC 可以對對象的某個(gè)屬性進(jìn)行賦值。假定現(xiàn)在我們有一個(gè)Person 類,類中包含兩個(gè)屬性:一個(gè)是只讀的name 屬性,一個(gè)是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

當(dāng)我們定義了屬性的時(shí)候,系統(tǒng)就為我們自動的生成了setter 和getter 方法。我們可以通過setter 和getter方法,或讀取或?qū)懭霐?shù)值。當(dāng)然我們也可以用KVC 的方式進(jìn)行讀寫數(shù)據(jù)。先看一下代碼,然后我們再簡述一下需要注意的問題。

#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 的年領(lǐng)是%@",[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 的年領(lǐng)是25

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

2)、支持鍵值路徑

什么叫支持鍵值路徑?說白了就是支持嵌套。假如現(xiàn)在有一個(gè)書籍類,類中包含了書籍的名稱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直接使用點(diǎn)局分開就好了,注意一下:這里使用的時(shí)keyPath,當(dāng)然在   “ 1)屬性賦值”   中我們也可以使用keyPath,只不過再不必要的情況下使用keyPath會浪費(fèi)性能而已。這里沒啥可說的了,說多了都對不起我一度5毛的電費(fèi)。

3)支持操作符

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

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

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

4)錯(cuò)誤攔截

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

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

 

那么我們可以在.m文件中重寫 -(void)setValue:(id)value forUndefinedKey:(NSString *)key 方法。這個(gè)方法會在字典轉(zhuǎn)模型時(shí),系統(tǒng)找不到同名的屬性時(shí)調(diào)用。所以我們可以再這個(gè)方法中進(jìn)行錯(cuò)誤攔截,并進(jìn)行賦值操作,這樣就不會報(bào)錯(cuò)了。

#import "Model.h"@implementation Model-(instancetype)initWithDict:(NSDictionary *)dict{    if (self=[super init])    {        //忘了介紹了 字典轉(zhuǎn)模型的常用語句        [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

 

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产亚洲综合一区二区 | 午夜久久久精品一区二区三区 | 色av成人天堂桃色av | 国产精品自拍av | 国产精品成人av片免费看最爱 | 午夜视频在线观看91 | 欧美成人国产va精品日本一级 | 国产亚洲精品久久久久久久软件 | 欧美日韩高清在线观看 | 国产福利不卡一区二区三区 | av电影免费观看 | 欧美精品18 | 成年人观看免费视频 | 成人国产精品一区 | xxxxhd86日本护士hd | 91精品国啪老师啪 | 99精品视频久久精品视频 | 99爱国产精品 | 19禁国产精品福利视频 | 九九热在线视频观看 | 国产一区二区高清在线 | 国产精品av久久久久久网址 | 午夜视频在线观看91 | 久久久久久久久久久一区 | 国产精品久久久久久模特 | 伊人在线视频 | 成人综合一区二区 | 一级黄色在线观看 | 欧美性久久久 | 精品久久久久久久久久中文字幕 | 红杏网站永久免费视频入口 | 国产91极品 | 成人免费网站在线观看 | 亚州精品天堂中文字幕 | 欧美性猛交xxxxx按摩国内 | 久久成人激情视频 | 色妞视频男女视频 | 欧美中文字幕一区二区 | 久久日韩 | 欧美 videos粗暴| 婷婷久久影院 |