Key-Value-Coding(KVC)鍵值編碼來訪問你要存取的類的屬性。編碼
定義Student類spa
//Student.h #import <Foundation/Foundation.h> @interface Student : NSObject { NSString *name; } @end // Student.m // KVCDemo // // Created by Michael on 2016/9/30. // Copyright © 2016年 Michael. All rights reserved. // #import "Student.h" @implementation Student @end
.m文件也沒有實現。name屬性沒有加property,原來的訪問方法就訪問不了name屬性了。怎麼辦呢?用kvc就能夠了code
void doKVC() { Student *stu = [[Student alloc] init]; [stu setValue:@"liuguoquan" forKey:@"name"]; //存的時候key和類屬性的名稱必須一致 NSString *name = [stu valueForKey:@"name"]; NSLog(@"姓名: %@",name); } 2016-10-10 11:50:47.338037 KVCDemo[17719:1396152] 姓名: liuguoquan
若是訪問這個類裏中的屬性中的屬性呢?那就用到了鍵路徑rem
關鍵字:鍵路徑取值valueForKeyPath數學
鍵路徑存值:forKeyPathit
新建一個類Course,課程類,課程類有課程名稱這個屬性io
// Course.h // KVCDemo // // Created by Michael on 2016/9/30. // Copyright © 2016年 Michael. All rights reserved. // #import <Foundation/Foundation.h> @interface Course : NSObject @end // Course.m // KVCDemo // // Created by Michael on 2016/9/30. // Copyright © 2016年 Michael. All rights reserved. // #import "Course.h" @implementation Course { NSString *courseName; } @end
在Student中添加Course屬性 ,student.h文件中代碼以下:class
#import <Foundation/Foundation.h> @class Course; @interface Student : NSObject { NSString *name; Course *course; } @end
在main方法中,咱們經過鍵路徑訪問Course中courseName的屬性import
void doRead() { Student *stu = [[Student alloc] init]; [stu setValue:@"liuguoquan" forKey:@"name"]; NSString *name = [stu valueForKey:@"name"]; NSLog(@"姓名: %@",name); //給類中的類成員變量賦值 Course *course = [[Course alloc] init]; [course setValue:@"語文" forKey:@"courseName"]; [stu setValue:course forKey:@"course"]; NSString *courseName = [stu valueForKeyPath:@"course.courseName"]; NSLog(@"課程: %@",courseName); //也能夠這樣存值 [stu setValue:@"數學課" forKeyPath:@"course.courseName"]; courseName = [stu valueForKeyPath:@"course.courseName"]; NSLog(@"課程名稱:%@", courseName); } 2016-10-10 11:50:47.339847 KVCDemo[17719:1396152] 姓名: liuguoquan 2016-10-10 11:50:47.340082 KVCDemo[17719:1396152] 課程: 語文 2016-10-10 11:50:47.340166 KVCDemo[17719:1396152] 課程名稱:數學課
在Student類中添加屬性 NSInteger point變量
#import <Foundation/Foundation.h> @class Course; @interface Student : NSObject { NSString *name; Course *course; NSInteger point; } @end
//自動封裝基本數據類型 void doRead2() { Student *stu = [[Student alloc] init]; [stu setValue:@"liuguoquan" forKey:@"name"]; NSString *name = [stu valueForKey:@"name"]; NSLog(@"姓名: %@",name); //給類中的類成員變量賦值 Course *course = [[Course alloc] init]; [course setValue:@"語文" forKey:@"courseName"]; [stu setValue:course forKey:@"course"]; NSString *courseName = [stu valueForKeyPath:@"course.courseName"]; NSLog(@"課程: %@",courseName); //咱們用NSString*類型設置的屬性值@"99",而咱們的屬性是NSInteger類型的,存取都沒有問題。 [stu setValue:@"99" forKey:@"point"]; NSString *point = [stu valueForKey:@"point"]; NSLog(@"分數: %@",point); } 2016-10-10 11:50:47.340190 KVCDemo[17719:1396152] 姓名: liuguoquan 2016-10-10 11:50:47.340210 KVCDemo[17719:1396152] 課程: 語文 2016-10-10 11:50:47.340393 KVCDemo[17719:1396152] 分數: 99