標籤:
1、KVC概述
KVC(Key-value coding)是一套利用字串標識符間接訪問對象屬性和關係的機制。Cocoa Programming中,Core Data,Application Scriptability, 綁定(Binding)技術和聲明屬性之一語言特性等,都是以KVC為基礎的。(Application Scriptability 和 綁定(Binding)是Mac OS X上特有的)。你也可以用Key-value coding來簡化你的代碼。
KVC(鍵-值編碼)是一個用於間接訪問對象屬性的機制,使用該機制不需要調用get和set方法就可以設定或擷取成員變數的值。
2、KVC的基礎
Keys and Key Paths
KEY:鍵(Key)是一個標識了對象的某個屬性的字串。通常,在接收對象中,一個鍵對應的是一個存取方法或者執行個體變數的名稱。Key必須是ASCII編碼,以小寫字母開頭,並且不能包含空白符。
鍵的一些樣本:payee, openingBalance, transactions, amount等
Key Path:鍵路徑(Key Path)是一個由多個Key組成,Key與Key之間用點(.)分開的字串,通過順序遍曆,擷取對象屬性。鍵路徑中的鍵序列的第一個鍵相對於當前的接收對象,而後續的鍵只與前一個鍵對應的屬性相關。
例如,對於鍵路徑address.street,其中我們從當前的接收對象中擷取address這一屬性值,然後再通過這個address的對象屬性去擷取street屬性。
使用KVC擷取屬性值:
方法valueForKey:
返回特定鍵對應的值,這個值是與接收對象相關的。如果輸入的鍵沒有對應的方法或者執行個體變數,接收對象會發出valueForUndefinedKey: 訊息。方法valueForUndefinedKey:預設會拋出NSUndefinedKeyException異常,可以在子類中改寫。
方法valueForKeyPath:
與之類似,返回特定鍵路徑在對應接收對象中的值。當鍵路徑的鍵序列中有任何一個鍵無法對應相容KVC的對象,則接收對象都會發出valueForUndefinedKey: 訊息。
方法dictionaryWithValuesForKeys:
對輸入的鍵數組中的每一個鍵進行檢索,返回包含了這些鍵對應的值的NSDictionary。
【備忘】集合對象(Collection Object),如NSArray, NSSet, NSDictionary等不能包含nil值。可以使用NSNull來替代nil放入集合對象中標識空值。NSNull提供一個簡單的執行個體來表示對象屬性的nil值。在方法 dictionaryWithValuesForKeys: 和 setValuesForKeysWithDictionary: 中,NSNull和nil之間的轉換是自動的,所以你的對象不用明確測試NSNull值。
使用KVC設定屬性值:
方法setValue:forKey:
給特定的鍵設值,這個值相對於對應的接收對象或者是已經提供的值。
方法setValuesForKeysWithDictionary:
可以從字典映射到對象,不需要再給一一給對象來賦值。使用NSDictionary來給一組鍵設值。該方法內部調用setValue:forKey:給每一組索引值對設值。想存入空值時,使用NSNull取代nil。 該方法常用於字典轉模型中,比如:
- (instancetype)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
self.icon = dict[@"icon"];
self.title = dict[@"title"];
self.answer = dict[@"answer"];
self.options = dict[@"options"];
}
return self;
}
+ (instancetype)questionWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
可以用KVC寫成:
+ (instancetype) questionWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
- (instancetype)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
iOS開發之KVC