天天看點

Objective-C進階程式設計——KVC(一)

【基本概念】

1.鍵值編碼是一個用于間接通路對象屬性的機制,使用該機制不需要調用存取方法和變量執行個體就可通路對象屬性。

2.鍵值編碼方法在OC非正式協定(類目)NSKeyValueCoding中被聲明,預設的實作方法由NSObject提供。

3.鍵值編碼支援帶有對象值的屬性,同時也支援純數值類型和結構。非對象參數和傳回類型會被識别并自動封裝/解封。

【鍵值通路】

  鍵值編碼中的基本調用包括-valueForKey: 和 -setValue:forkey: 這兩個方法,它們以字元串的形式向對象發送消息字元串是我們關注屬性的關鍵。下面是我示範的一個簡單的例子:

(1)建立一個Book類,在頭檔案中加入如下屬性:

@property(strong,nonatomic) NSString *name;

           

(2)在main.m中實作如下:

#import <Foundation/Foundation.h>
#import "Book.h"

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

    
    Book *book = [[Book alloc] init];
    [book setValue:@"老人與海" forKey:@"name"];
    
    NSLog(@"這本書的名字是:%@",[book valueForKey:@"name"]);
    
    
    
  }
    return 0;
}
           

(3)輸出結果如下:

Objective-C進階程式設計——KVC(一)

是否存在setter、getter方法,如果不存在,他将在内部查找名為_key或key的執行個體變量。通過KVC,可以擷取不存在getter方法的對象值,無需通過對象指針直接通路。這裡我們需要注意,當我們通過setValue:forKey:設定對象的值,或通過valueForKey來擷取對象的值時,若對象的執行個體變量為基本資料類型時(char,int,float,BOOL),我們需要對資料進行封裝。

【路徑通路】

     除了通過鍵設定外,鍵值編碼還支援指定路徑,像檔案系統一樣。用“點”号隔開。下面我給大家示範一個程式:

(1)建立一個Book類,在.h頭檔案中如下:

#import <Foundation/Foundation.h>
#import "Author.h"

@interface Book : NSObject

@property(strong,nonatomic) NSString *name;

@property(strong,nonatomic) Author *author;

@end
           

(2)建立一個Author類,在.h頭檔案中如下:

#import <Foundation/Foundation.h>

@interface Author : NSObject

@property(strong,nonatomic) NSString *authorName;

@end
           

(3)在main.m檔案中實作如下:

#import <Foundation/Foundation.h>
#import "Book.h"
//這裡不再需要引入Author.h頭檔案了,該頭檔案已經在Book.h中引入了。

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

    
    Book *book = [[Book alloc] init];
    [book setValue:@"老人與海" forKey:@"name"];
    
    
    Author *author = [[Author alloc] init];
    [author setValue:@"海明威" forKey:@"authorName"];
    
    
    [book setValue:author forKey:@"author"];
    
    NSLog(@"這本書的名字是:%@",[book valueForKey:@"name"]);
    NSLog(@"這本書的作者是:%@",[book valueForKeyPath:@"author.authorName"]);
    
    
    [book setValue:@"是海明威嗎?" forKeyPath:@"author.authorName"];
    NSLog(@"這本書的作者是:%@",[book valueForKeyPath:@"author.authorName"]);

    
  }
    return 0;
}
           

(4)輸出結果如下:

Objective-C進階程式設計——KVC(一)

【KVC的簡單運算】

     此外,還可以應用一些字元做簡單運算。sum,min,max,avg,count

【基本資料類型的封裝】

KVC中的setValue: forKey: 方法和valueForKey:方法不能直接對基本資料類型進行操作,需要進行包裝,示例代碼如下:

#import <Foundation/Foundation.h>
#import "Book.h"
//這裡不再需要引入Author.h頭檔案了,該頭檔案已經在Book.h中引入了。

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

    
    Book *book = [[Book alloc] init];
    [book setValue:[[NSNumber alloc] initWithFloat:12.8] forKey:@"price"];//要在這裡進行包裝;

    NSLog(@"書本的價格是:%@",[book valueForKey:@"price"]);
    
  }
    return 0;
}
           

github首頁:https://github.com/chenyufeng1991  。歡迎大家通路!