你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS KVC 概述

iOS KVC 概述

編輯:IOS開發綜合

KVC

KVC 的基本概念 —–>What

KVC 是一種間接更改對象狀態(或者說是屬性值)的方式:key-value coding 簡稱 KVC. 主要本質特點是采用字符串來標識對象的屬性變量,並可以利用這個標識來更改對象的狀態(或者說是屬性值) 這種間接表現在通過字符串來標識屬性,?而不是通過調?用存取?方法或直接地訪問實例變量的方式。 KVC機制不僅?支持對象,還?支持標量和結構體類型,這些?非對象的類型會被?自動的裝箱和開箱。

Key & Key Path

鍵(Key)是?一個字符串?用來標識對象?裡?面的?一個指定的屬性。?一般?一個鍵對應對象的存取?方法或 實例變量。鍵必須是ASCII碼,?一般以?小寫字?母開始,不能包含空格。
A key path is a string of dot separated keys that is used to specify a sequence of object properties to traverse. The property of the first key in the sequence is relative to the receiver, and each subsequent key is evaluated relative to the value of the previous property.
鍵路徑(Key Path)是?一個由點進?行分割的?一系列鍵組成的字符串
鍵路徑的概念和表示:可以在對象和不同的變量名稱之間用圓點分開來表示.

注意:
鍵路徑的深度是任意的,具體取決於對象之間的關系的復雜度

KVC 基本用法

   - (void)setValue:(id)value forKey:(NSString *)key
   - (id)valueForKey:(NSString *)key
   - (id)valueForKey:(NSString *)key //以 key 作為標示符,獲取其對應的屬性值
   - (void)setValue:(id)value forKey:(NSString *)key //以 key 作為標示符設置其對應的屬性值
   - (id)valueForUndefinedKey:(NSString *)key
   - (void)setNilValueForKey:(NSString *)key

KVC 的調用機制:

valueForKey: 會首先查找以參數名命名(格式為 -key 或者 isKey) 的 getter 方法,如果找到的話澤調用這個方法; 如果沒有找到這樣的getter 方法,它將會在對象內部尋找名稱格式為_ key 或者 key 的實例變量,然後返回. setValue:forKey: 的機制跟 valueForKey 相似.它會首先查找參數名的 setter 方法,如果找到的話則完成設置; 如果沒有找到 setter 方法,則直接在類中找到名稱格式為_ key 或者 key 的實例變量,然後將 value 賦值給它.

KVC 在集合中的使用

@avg

NSnumber *transactionAverage = [transactions valueForKeyPath:@@avg.amount];

@count

 NSNumber *numberOfTransactions = [transactions valueForKeyPath:@@count]
?;

@max

NSDate *latestDate = [transactions valueForKeyPath:@@max.date];

@min

NSDate *earliestDate = [transactions valueForKeyPath:@@min.date];

@sum

NSNumber *amountSum = [transactions valueForKeyPath:@@sum.amount];

使用鍵值和鍵路徑的方法比較簡單,我就直接用一個 KVC在集合中的使用來演示

創建一個 QYPerson 類繼承於 NSObject

#import 


@class QYCourse;
@interface QYPerson : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) QYCourse *course;
@property (nonatomic, assign) NSInteger point;
@property (nonatomic, strong) NSArray *persons;
@end

在 main.m 函數中

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

        QYPerson *person = [[QYPerson alloc] init];

        QYPerson *p1 = [[QYPerson alloc] init];
        QYPerson *p2 = [[QYPerson alloc] init];
        QYPerson *p3 = [[QYPerson alloc] init];

        [p1 setValue:@78 forKey:@point];
        [p2 setValue:@87 forKey:@point];
        [p3 setValue:@98 forKey:@point];
        NSArray *array = @[p1,p2,p3];
        [person setValue:array forKey:@persons];
        NSLog(@other persons' achievement info:%@,[person valueForKeyPath:@persons.point]);
        NSLog(@all persons' number is %@,[person valueForKeyPath:@persons.@count]);
        NSLog(@the max achievement :%@,[person valueForKeyPath:@[email protected]]);
         NSLog(@the min achievement :%@,[person valueForKeyPath:@[email protected]]);
         NSLog(@the avg achievement :%@,[person valueForKeyPath:@[email protected]]);
    }
    return 0;
}

輸出的結果如下:

2015-07-29 15:25:48.856 KVCDemo[2968:1026943] other persons' achievement info:(
    78,
    87,
    98
)
2015-07-29 15:25:48.856 KVCDemo[2968:1026943] all persons' number is 3
2015-07-29 15:25:48.856 KVCDemo[2968:1026943] the max achievement :98
2015-07-29 15:25:48.856 KVCDemo[2968:1026943] the min achievement :78
2015-07-29 15:25:48.876 KVCDemo[2968:1026943] the avg achievement :87.666666666666666666666666666666666666

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved