鍵值編碼KVC

2021-07-05 17:40:13 字數 3289 閱讀 9567

許多程式設計技術都基於間接機制,包括整個物件導向程式設計領域。本章將介紹另一種間接機制,這種機制不屬於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...