KVC的簡(jiǎn)單使用

KVC即Key Value Coding鍵值編碼,它提供了一種通過(guò)字符串而不是訪問(wèn)器間接訪問(wèn)或修改對(duì)象屬性的機(jī)制。

1.修改/獲取屬性

如下通過(guò)KVC的setValue forKey對(duì)person的name屬性進(jìn)行了修改(即使是私有屬性)并通過(guò)valueForKey獲取了name屬性。

#import "ViewController.h"

@interface Person : NSObject

@end

@implementation Person
{
NSString *_name;
}

@end

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
Person *p = [[Person alloc]init];
[p setValue:@"xiaoming" forKey:@"name"];
NSLog(@"name=%@",[p valueForKey:@"name"]);
}
//打印信息
2017-02-16 [2376:681411] name=xiaoming
@end
2.KeyPath

當(dāng)一個(gè)對(duì)象的屬性是其他自定義類時(shí),可以通過(guò)key獲得這個(gè)自定義類,再通過(guò)key獲得自定義類的某個(gè)屬性,顯然這樣做比較麻煩,對(duì)此,KVC提供了一個(gè)解決方案,那就是鍵路徑KeyPath。

#import "ViewController.h"

@interface OldPerson : NSObject
@property (nonatomic,copy)NSString* age;
@end

@implementation OldPerson

@end

@interface Person : NSObject
@property (strong, nonatomic) OldPerson *oldPerson;
@end

@implementation Person
{
NSString *name;
}

@end

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
Person *p = [[Person alloc]init];
p.oldPerson = [[OldPerson alloc]init];

[p setValue:@"100" forKeyPath:@"oldPerson.age"];
NSLog(@"age=%@",p.oldPerson.age);
}

@end
//打印信息:
2017-02-16 [2391:685170] age=100

可以看到oldPerson的age屬性直接通過(guò)KeyPath:@"oldPerson.age"得到修改,注意這里是oldPerson對(duì)象的age屬性,不是OldPerson。

3.KVC與字典
- (void)viewDidLoad {
[super viewDidLoad];
Dog *husky = [[Dog alloc]initWithName:@"husky" age:20 weight:30];
//模型轉(zhuǎn)字典
NSDictionary *huskyDic = [husky dictionaryWithValuesForKeys:@[@"name",@"age",@"weight"]];
NSLog(@"huskyDic=%@",huskyDic);
Dog *wolfhound = [[Dog alloc]initWithName:@"wolfhound" age:50 weight:60];
NSLog(@"wolfhound_old Name=%@ age=%lu weight=%lf",wolfhound.name,wolfhound.age,wolfhound.weight);
//字典轉(zhuǎn)模型
[wolfhound setValuesForKeysWithDictionary:huskyDic];
NSLog(@"wolfhound_new Name=%@ age=%lu weight=%lf",wolfhound.name,wolfhound.age,wolfhound.weight);

//打印出:

2017-02-25 huskyDic={
age = 20;
name = husky;
weight = 30;
}
2017-02-25 wolfhound_old Name=wolfhound age=50 weight=60.000000
2017-02-25 wolfhound_new Name=husky age=20 weight=30.000000

}

可以看到通過(guò)dictionaryWithValuesForKeys成功的將husky的屬性轉(zhuǎn)成了字典,通過(guò)setValuesForKeysWithDictionary成功的將字典轉(zhuǎn)換成了對(duì)應(yīng)的模型,使代碼得到簡(jiǎn)化。

PS: I am xinghun who is on the road.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • KVC(Key-value coding)鍵值編碼,iOS的開發(fā)中,可以允許開發(fā)者通過(guò)Key名直接訪問(wèn)對(duì)象的屬性,...
    CALayer_Sai閱讀 2,691評(píng)論 0 4
  • KVC(Key-value coding)鍵值編碼,單看這個(gè)名字可能不太好理解。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    朽木自雕也閱讀 1,693評(píng)論 6 1
  • KVC(Key-value coding)鍵值編碼,單看這個(gè)名字可能不太好理解。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    黑暗中的孤影閱讀 50,250評(píng)論 74 441
  • KVC字典轉(zhuǎn)模型 KVC 中經(jīng)常使用的就是字典轉(zhuǎn)模型 KVC的大招 KVC設(shè)置對(duì)象屬性及取值 KVC間接設(shè)置對(duì)象屬...
    冷漠叻葒顏閱讀 4,892評(píng)論 0 15
  • 我想要的愛(ài),是細(xì)水長(zhǎng)流溫柔浪漫,不是很猛烈地來(lái)的快去的也快。如果你愛(ài)我,就讓我覺(jué)得你愛(ài)我吧,溫柔體貼似最初追我的你...
    辛德瑞拉的小紅鞋閱讀 217評(píng)論 0 2

友情鏈接更多精彩內(nèi)容