許多程式設計技術都基於間接機制,包括整個物件導向程式設計領域。本章將介紹另一種間接機制,這種機制不屬於obj-c語言的特性,而是cocoa提供的一種特性。
我們知道在c#中可以通過反射讀寫乙個物件的屬性,有時候這種方式特別方便,因為你可以利用字串的方式去動態控制乙個物件。其實由於objc的語言特性,你根本不必進行任何操作就可以進行屬性的動態讀寫,這種方式就是key value coding(簡稱kvc)。
一些更加高階的cocoa特性,例如core data和cocoa bindings(本書將不介紹該內容),在基礎機制中包含了kvc。kvc的操作方法由nskeyvaluecoding協議提供,而nsobject就實現了這個協議,也就是說objc中幾乎所有的物件都支援kvc操作。
- (void)setvalue:(nullable id)value forkey:(nsstring *)key;
(用於簡單路徑)
- (void)setvaluesforkeyswithdictionary:(nsdictionary*)keyedvalues;
(用於復合路徑,例如person有乙個account型別的屬性,那麼person.account就是乙個復合屬性)
- (void)setvaluesforkeyswithdictionary:(nsdictionary*)keyedvalues
;(用於字典傳入,大資料賦值)
- (nullable id)valueforkey:(nsstring *)key;
(簡單路徑取值)
- (nullable id)valueforkeypath:(nsstring *)keypath;
(復合路徑取值)
- (nsdictionary*)dictionarywithvaluesforkeys:(nsarray*)keys;
(批量取值,可以一致性提取多個資料)
address.h
//
// address.h
// kvc
//// created by yangjun on 15/10/10.
//#import
/** 位址*/
@inte***ce address : nsobject
@property (nonatomic, copy) nsstring *addressname;///< 位址名
@end
user.h
//
// user.h
// kvc
//// created by yangjun on 15/10/10.
//#import
#import
"address.h"
/** 使用者*/
@inte***ce user : nsobject
@property (nonatomic, copy) nsstring *username; ///< 使用者名稱
@property (nonatomic, strong) address *address; ///< 使用者位址
@end
//
// kvctests.m
// kvctests
//// created by yangjun on 15/10/10.
//#import
#import "user.h"
@inte***ce
kvctests : xctestcase
@end
@implementation
kvctests
- (void)setup
- (void)testexample
@end
2015-10-1013:
51:17.453
kvc[8450
:699448] 使用者名稱:yangjun;位址:beijing
2015-10-1013:
51:59.677
kvc[8450
:699448] 使用者名稱:君;位址:北京
2015-10-1013:
51:59.677
kvc[8450
:699448] 使用者名稱:陽;位址:北京站
2015-10-1013:
51:59.677
kvc[8450
:699448]
setvalue(value: anyobject?, forkey key: string)
(用於簡單路徑)
setvalue(value: anyobject?, forkeypath keypath: string)
(用於復合路徑,例如person有乙個account型別的屬性,那麼person.account就是乙個復合屬性)
setvaluesforkeyswithdictionary(keyedvalues: [string : anyobject])
;(用於字典傳入,大資料賦值)
valueforkey(key: string) -> anyobject?
(簡單路徑取值)
valueforkeypath(keypath: string) -> anyobject?
(復合路徑取值)
dictionarywithvaluesforkeys(keys: [string]) -> [string : anyobject]
(批量取值,可以一致性提取多個資料)
user.swift
import foundation
/// 使用者
class user: nsobject
}
//
// kvctests.swift
// kvctests
//// created by yangjun on 15/10/10.
//import xctest
@testable import kvc
/// kvc測試
class kvctests: xctestcase
func testexample()
}
optional("yangj")
optional("陽")
["username": 陽君]
鍵值編碼 KVC 簡單的KVC
main.m kvc一 created by goddog on 15 1 3.1.我們可以通過setter和getter方法來設定和修改物件的屬性,同時也可以通過鍵值編碼 kvc 來操作物件屬性。2.何為kvc 以字串的形式間接的操作物件的屬性。設定值用 setvalue 屬性值 forkey 屬...
Objective C之KVC 鍵值編碼
ios中key value coding kvc 俗稱鍵值編碼,是乙個非正式的協議,它提供一種機制來間接訪問物件的屬性。直接訪問物件是通過呼叫訪問器的方法實現,而kvc不需要呼叫訪問器的設定和獲取方法,可以直接訪問物件的屬性。kvc的操作方法由nskeyvaluecoding協議提供,而nsobje...
物件導向 鍵值編碼 KVC 與鍵值監聽 KVO
最基本的kvc由nskeyvaluecoding協議提供支援,最基本的操作屬性的兩個方法如下 setvalue 屬性值forkey 屬性名 為指定屬性設定值。valueforkey 屬性名 獲取指定屬性值 在kvc程式設計方式中,無論呼叫setvalue forkey 方法,還是呼叫valuefor...