日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

Objective-C语法之KVC使用 有图有真相

發(fā)布時(shí)間:2025/3/20 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Objective-C语法之KVC使用 有图有真相 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。