Objective-C语法之KVC使用 有图有真相
Objective-C語(yǔ)法之KVC使用
除了一般的賦值和取值的方法,我們還可以用Key-Value-Coding(KVC)鍵值編碼來(lái)訪(fǎng)問(wèn)你要存取的類(lèi)的屬性。
下圖來(lái)自蘋(píng)果官網(wǎng):
?
如何使用KVC存取對(duì)象屬性呢?看個(gè)示例
1、使用KVC
定義一個(gè)Student類(lèi),繼承于NSObject。
.h文件
#import <Foundation/Foundation.h>@interface Student : NSObject {NSString *name; } @end.m文件
#import "Student.h"@implementation Student@end.m文件也沒(méi)有實(shí)現(xiàn)。name屬性沒(méi)有加property,原來(lái)的訪(fǎng)問(wèn)方法就訪(fǎng)問(wèn)不了name屬性了。怎么辦呢?用kvc就可以了
#import "Student.h"int main(int argc, const char * argv[]) {@autoreleasepool {Student *student = [[[Student alloc]init ]autorelease];[student setValue:@"張三" forKey:@"name"];NSString *name = [student valueForKey:@"name"];NSLog(@"學(xué)生姓名:%@",name);}return 0; }打印結(jié)果:
2012-07-20 15:04:09.920 objectiveC[1977:403]?學(xué)生姓名:張三
張三 這個(gè)值存進(jìn)去了,通過(guò)valueForKey取出來(lái)了。
如果存的時(shí)候key和類(lèi)屬性的名稱(chēng)不一致會(huì)怎么樣呢?
代碼改成?
? ? ? ??[student?setValue:@"張三"?forKey:@"name1"];
運(yùn)行,程序崩潰 ,打印:
2012-07-20 15:09:40.432 objectiveC[2069:403] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Student 0x106f14270> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name1.'
提示沒(méi)有這個(gè)name1 這個(gè)key。
2、鍵路徑訪(fǎng)問(wèn)屬性
如果訪(fǎng)問(wèn)這個(gè)類(lèi)里中的屬性中的屬性呢?那就用到了鍵路徑?
關(guān)鍵字:鍵路徑取值valueForKeyPath 鍵路徑存值:forKeyPath
新建一個(gè)類(lèi)Course,課程類(lèi),課程類(lèi)有課程名稱(chēng)這個(gè)屬性
.h文件
#import <Foundation/Foundation.h>@interface Course : NSObject {NSString *CourseName; } @end.m文件
#import "Course.h"@implementation Course@end在Student中添加Course屬性 ,student.h文件中代碼如下:
#import <Foundation/Foundation.h> @class Course; @interface Student : NSObject {NSString *name;Course *course; } @end實(shí)現(xiàn)還是什么都沒(méi)有,這里就不貼代碼了
在main方法中,我們實(shí)驗(yàn)通過(guò)鍵路徑訪(fǎng)問(wèn)Course中CourseName的屬性
#import "Student.h" #import "Course.h"int main(int argc, const char * argv[]) {@autoreleasepool {Student *student = [[[Student alloc]init ]autorelease];[student setValue:@"張三" forKey:@"name"];NSString *name = [student valueForKey:@"name"];NSLog(@"學(xué)生姓名:%@",name);Course *course = [[[Course alloc]init] autorelease];[course setValue:@"語(yǔ)文課" forKey:@"CourseName"];[student setValue:course forKey:@"course"];NSString *courseName = [student valueForKeyPath:@"course.CourseName"];NSLog(@"課程名稱(chēng):%@", courseName);//也可以這樣存值[student setValue:@"數(shù)學(xué)課" forKeyPath:@"course.CourseName"];courseName = [student valueForKeyPath:@"course.CourseName"];NSLog(@"課程名稱(chēng):%@", courseName);}return 0; }運(yùn)行打印結(jié)果:
2012-07-20 15:33:51.902 objectiveC[2415:403]?學(xué)生姓名:張三
2012-07-20 15:33:51.904 objectiveC[2415:403]?課程名稱(chēng):語(yǔ)文課
2012-07-20 15:33:51.904 objectiveC[2415:403]?課程名稱(chēng):數(shù)學(xué)課
3、自動(dòng)封裝基本數(shù)據(jù)類(lèi)型
我們?cè)赟tudent類(lèi)中添加分?jǐn)?shù)屬性 NSInteger point;
.h文件
#import <Foundation/Foundation.h> @class Course; @interface Student : NSObject {NSString *name;Course *course;NSInteger point; } @end.m文件不改變
#import "Student.h" #import "Course.h"int main(int argc, const char * argv[]) {@autoreleasepool {Student *student = [[[Student alloc]init ]autorelease];[student setValue:@"張三" forKey:@"name"];NSString *name = [student valueForKey:@"name"];NSLog(@"學(xué)生姓名:%@",name);Course *course = [[[Course alloc]init] autorelease];[course setValue:@"語(yǔ)文課" forKey:@"CourseName"];[student setValue:course forKey:@"course"];NSString *courseName = [student valueForKeyPath:@"course.CourseName"];NSLog(@"課程名稱(chēng):%@", courseName);//也可以這樣存值[student setValue:@"數(shù)學(xué)課" forKeyPath:@"course.CourseName"];courseName = [student valueForKeyPath:@"course.CourseName"];NSLog(@"課程名稱(chēng):%@", courseName);[student setValue:@"88" forKeyPath:@"point"];NSString *point = [student valueForKey:@"point"];NSLog(@"分?jǐn)?shù):%@", point);}return 0; }打印結(jié)果:
2012-07-20 15:43:19.593 objectiveC[2533:403]?學(xué)生姓名:張三
2012-07-20 15:43:19.596 objectiveC[2533:403]?課程名稱(chēng):語(yǔ)文課
2012-07-20 15:43:19.596 objectiveC[2533:403]?課程名稱(chēng):數(shù)學(xué)課
2012-07-20 15:43:19.598 objectiveC[2533:403]?分?jǐn)?shù):88
我們用NSString*類(lèi)型設(shè)置的屬性值@"88",而我們的屬性是NSInteger類(lèi)型的,存取都沒(méi)有問(wèn)題。
4、操作集合
在Student類(lèi)中加入數(shù)組NSArray,用來(lái)表示其他的學(xué)生。這樣我們可以添加多個(gè)其他的學(xué)生,再用集合操作計(jì)算學(xué)生的分?jǐn)?shù),最高分,最低分,平均分等
#import <Foundation/Foundation.h> @class Course; @interface Student : NSObject {NSString *name;Course *course;NSInteger point;NSArray *otherStudent; } @end.m文件實(shí)現(xiàn)不變。
在main函數(shù)中添加三個(gè)學(xué)生,添加到數(shù)組中,然后求平均分,最高,最低分,學(xué)生數(shù)量
#import "Student.h" #import "Course.h"int main(int argc, const char * argv[]) {@autoreleasepool {Student *student = [[[Student alloc]init ]autorelease];[student setValue:@"張三" forKey:@"name"];NSString *name = [student valueForKey:@"name"];NSLog(@"學(xué)生姓名:%@",name);[student setValue:@"88" forKey:@"point"];NSString *point = [student valueForKey:@"point"];NSLog(@"分?jǐn)?shù):%@", point);Student *student1 = [[[Student alloc]init]autorelease];Student *student2 = [[[Student alloc]init]autorelease];Student *student3 = [[[Student alloc]init]autorelease];[student1 setValue:@"65" forKey:@"point"];[student2 setValue:@"77" forKey:@"point"];[student3 setValue:@"99" forKey:@"point"];NSArray *array = [NSArray arrayWithObjects:student1,student2,student3,nil];[student setValue:array forKey:@"otherStudent"];NSLog(@"其他學(xué)生的成績(jī)%@", [student valueForKeyPath:@"otherStudent.point"]);NSLog(@"共%@個(gè)學(xué)生", [student valueForKeyPath:@"otherStudent.@count"]);NSLog(@"最高成績(jī):%@", [student valueForKeyPath:@"otherStudent.@max.point"]);NSLog(@"最低成績(jī):%@", [student valueForKeyPath:@"otherStudent.@min.point"]);NSLog(@"平均成績(jī):%@", [student valueForKeyPath:@"otherStudent.@avg.point"]);}return 0; }運(yùn)行打印結(jié)果
2012-07-20 16:09:17.101 objectiveC[2857:403]?學(xué)生姓名:張三
2012-07-20 16:09:17.104 objectiveC[2857:403]?分?jǐn)?shù):88
2012-07-20 16:09:17.105 objectiveC[2857:403]?其他學(xué)生的成績(jī)(
? ? 65,
? ? 77,
? ? 99
)
2012-07-20 16:09:17.106 objectiveC[2857:403]?共3個(gè)學(xué)生
2012-07-20 16:09:17.106 objectiveC[2857:403]?最高成績(jī):99
2012-07-20 16:09:17.107 objectiveC[2857:403]?最低成績(jī):65
2012-07-20 16:09:17.108 objectiveC[2857:403]?平均成績(jī):80.333333333333333333333333333333333333
還可以求總和 ?@sum。
著作權(quán)聲明:本文由http://www.cnblogs.com/stoic/原創(chuàng),歡迎轉(zhuǎn)載分享。請(qǐng)尊重作者勞動(dòng),轉(zhuǎn)載時(shí)保留該聲明和作者博客鏈接,謝謝!轉(zhuǎn)載于:https://www.cnblogs.com/zhidao-chen/archive/2012/08/06/2624880.html
總結(jié)
以上是生活随笔為你收集整理的Objective-C语法之KVC使用 有图有真相的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DIV+CSS布局,第五课,DOCTYP
- 下一篇: VC++实现获取网络时间