[原創]obj-c編程16:索引值編碼(KVC)

來源:互聯網
上載者:User

[原創]obj-c編程16:索引值編碼(KVC)

原文連結:obj-c編程16:索引值編碼(KVC)

 

我們可以藉助obj-c中的索引值編碼(以後簡稱KVC,Key-Value Coding)來存取類的屬性,通過指定所要訪問的屬性名稱字串標示符,可以使用存取器方法來擷取或設定類的屬性。下面的例子,藉助於KVC的功能讀取和設定了類Son執行個體的屬性i:

 1 #import <Foundation/Foundation.h> 2  3 #define msg(...) NSLog(__VA_ARGS__) 4 #define mki(x) [NSNumber numberWithInt:x] 5  6 @interface Son:NSObject{ 7     NSArray *ary; 8     NSNumber *i; 9 }10     @property NSArray *ary;11     @property NSNumber *i;12 @end13 14 @implementation Son15     @synthesize ary,i;16 17     -(id)init{18         return [self init:0];19     }20 21     -(id)init:(int)i_v{22         self = [super init];23         if(self){24             ary = [NSArray arrayWithObjects:mki(1),mki(2),mki(10),\25                 mki(100),nil];26             i = [NSNumber numberWithInt:i_v];27         }28         return self;29     }30 @end31 32 int main(int argc,char *argv[])33 {34     @autoreleasepool{35         Son *son = [[Son alloc] init];36         [son setValue:mki(1001) forKey:@"i"];37         msg(@"%@",[son valueForKey:@"i"]);38         msg(@"%@",[son valueForKeyPath:@"ary.@count"]);

運行結果如下:

apple@kissAir: objc_src$clang -fobjc-arc -framework Foundation k.m -o kapple@kissAir: objc_src$./k2014-07-06 15:51:56.098 k[1386:507] 1001

 

KVC其中有KeyPath的概念,比如類Baba中有一個屬性名稱為son,其是Son的對象;而類Son中也有屬性NSString name,這時我們可以使用KeyPath的文法,像遍曆樹一樣找到最終的屬性name:

[baba valueForKeyPath:@"son.name"];

[baba setValue:@"tom" forKeyPath:@"son.name"];

除了遍曆對象關係以外,我們還可以訪問一些操作對象集合的函數,比如求平均數等等:

下面實際看一個例子

 1 #import <Foundation/Foundation.h> 2  3 #define msg(...) NSLog(__VA_ARGS__) 4 #define mki(x) [NSNumber numberWithInt:x] 5  6 @interface Son:NSObject{ 7     NSArray *ary; 8     NSNumber *i; 9 }10     @property NSArray *ary;11     @property NSNumber *i;12 @end13 14 @implementation Son15     @synthesize ary,i;16 17     -(id)init{18         return [self init:0];19     }20 21     -(id)init:(int)i_v{22         self = [super init];23         if(self){24             ary = [NSArray arrayWithObjects:mki(1),mki(2),mki(10),\25                 mki(100),nil];26             i = [NSNumber numberWithInt:i_v];27         }28         return self;29     }30 @end31 32 int main(int argc,char *argv[])33 {34     @autoreleasepool{35         Son *son = [[Son alloc] init];36         [son setValue:mki(1001) forKey:@"i"];37         msg(@"%@",[son valueForKey:@"i"]);38         msg(@"%@",[son valueForKeyPath:@"ary.@count"]);39 40         Son *son0 = [[Son alloc] init:11];41         Son *son1 = [[Son alloc] init:200];42         Son *son2 = [[Son alloc] init:25];43 44         NSArray *ary = [NSArray arrayWithObjects:son,son0,son1,son2,nil];45         msg(@"avg:%@",[ary valueForKeyPath:@"@avg.i"]);46         msg(@"sum:%@",[ary valueForKeyPath:@"@sum.i"]);47 48     }49     return 0;50 }

運行結果如下:

apple@kissAir: objc_src$./k2014-07-06 15:51:56.098 k[1386:507] 10012014-07-06 15:51:56.100 k[1386:507] 42014-07-06 15:51:56.100 k[1386:507] avg:309.252014-07-06 15:51:56.101 k[1386:507] sum:1237

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.