天天看點

IOS學習筆記七之KVC和Key路徑

1、KVC介紹

1)、KVC是由NSKeyValueCoding協定提供支援最基本的屬性和兩個方法如下

setValue:屬性值  forkey:屬性名:為指定屬性設定值

valueForKey:屬性名   (得到或者指定屬性的值)

2)、當設定value為nil的時候,我們需要在類的實作裡面重寫setNilValueForKey方法,不然會抛出NSInvalidArgumentException

2、key路徑介紹

KVC除了操作對象的屬性之外,還可以操作對象的“複合屬性”,比如類裡面的成員變量是對象,然後給這個成員變量的對象進行指派,就這樣簡單了解,指派之前一定要記得把這個對象進行初始化操作

KVC協定中為操作Key路徑的方法如下

setValue:forKeyPath:根據Key設定屬性值

valueForKeyPath:根據key的路徑擷取屬性值

2、測試簡單Demo

User.h

#ifndef User_h

#define User_h

#import <Foundation/Foundation.h>

@interface User : NSObject

@property (nonatomic) NSString *name;

@property (nonatomic, strong) NSString *city;

@property (nonatomic, copy) NSString *add;

@property NSString *pass;

@property NSDate *birth;

@property NSDate *birth1;

@end

#endif /* User_h */

User.m

#import "User.h"

@implementation User

@synthesize name = _name;

@synthesize pass;

@synthesize  birth;

-(void) setName:(NSString *)name

{

   self->_name = [NSString stringWithFormat:@"hello%@", name];

}

KVCPerson.h

#ifndef KVCPerson_h

#define KVCPerson_h

@interface KVCPerson : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *pass;

@property (nonatomic, copy) NSDate *birth;

@property (nonatomic) int price;

@property (nonatomic) User *user;

#endif /* KVCPerson_h */

KVCPerson.m

#import "KVCPerson.h"

@implementation KVCPerson

-(void)setNilValueForKey:(id)key

   if ([key isEqualToString:@"price"])

   {

       _price = 0;

   }

   else

       [super setNilValueForKey:key];

main.m

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

#import "Person.h"

#import "Apple.h"

#import "Args.h"

#import "FKItem.h"

#import "FKOrder.h"

int main(int argc, char * argv[]) {

   @autoreleasepool {

       KVCPerson *person = [KVCPerson new];

       [person setValue:@"chenyu" forKey:@"name"];

       [person setValue:@"1234" forKey:@"pass"];

       [person setValue:[NSDate date] forKey:@"birth"];

       NSLog(@"name is %@", [person valueForKey:@"name"]);

       NSLog(@"pass is %@", [person valueForKey:@"pass"]);

       NSLog(@"birth is %@", [person valueForKey:@"birth"]);

       NSLog(@"price is %@", [person valueForKey:@"price"]);

       [person setValue:nil forKey:@"name"];

       [person setValue:nil forKey:@"price"];

       [person setValue:[User new] forKeyPath:@"user"];

       //在使用valueForKeyPath之前一定要記得把成員對象進行初始化,不然直接設定無效

       [person setValue:@"hello" forKeyPath:@"user.city"];

       NSLog(@"user.city is%@", [person valueForKeyPath:@"user.city"]);

3、運作結果

name is chenyu

pass is 1234

birth is Fri Jul  6 22:39:34 2018

price is 0

name is (null)

user.city is hello

4、總結

在使用key的時候,一定要記得先把成員屬性的對象進行初始化,不然設定無效

如下

而不是

這樣結果會是null

繼續閱讀