KVC - NSKeyValueCoding

簡(jiǎn)述:對(duì)私有變量進(jìn)行賦值肥缔。

  • 在系統(tǒng)框架 Foundation 中 NSKeyValueCoding.h 有更多的一些方法谢揪。
  • KVC具體應(yīng)用場(chǎng)景:有待細(xì)究(還望告知)

單個(gè)類KVC 賦值基礎(chǔ)數(shù)據(jù)孝情。

  • 賦值:setValue: forKey:
  • 獲缺⒁ā:valueForKey:

例如有一個(gè) Person 的類谢澈,包含一些私有屬性煌贴。

@interface Person ()
{
// 大致包含以下幾類數(shù)據(jù)
    NSString *_name;
    NSNumber *_age;
    
    NSArray *_colors;
    NSDictionary *_family;
    NSMutableDictionary *_works;
    
    NSOrderedSet *_aOrderSet;
    NSSet *_aSet;

    NSMutableArray *_aMuArray;
    NSMutableSet *_aMuSet;
    NSMutableOrderedSet *_aMuOrderSet;
}
@end

在其他調(diào)用時(shí)可以使用KVC,進(jìn)行賦值锥忿,以及獲取牛郑。類似的不重復(fù)舉例。

    Person *aPerson = [[Person alloc] init];
    
    // NSString
    [aPerson setValue:@"村長(zhǎng)" forKey:@"_name"];
    NSString *value_name = [aPerson valueForKey:@"name"];
    NSLog(@"%@",value_name);
    
    // NSNumber
    [aPerson setValue:@12 forKey:@"_age"];
    NSNumber *value_age = [aPerson valueForKey:@"_age"];
    NSLog(@"%@",value_age);
    
    // NSArray
    [aPerson setValue:@[[UIColor redColor],[UIColor grayColor]] forKey:@"_colors"];
    NSArray *value_colors = [aPerson valueForKey:@"_colors"];
    self.view.backgroundColor = value_colors[0];

    // NSMutableArray
    NSMutableArray *muarr = [NSMutableArray array];
    [muarr addObject:@"one"];
    [muarr addObject:@"two"];
    [aPerson setValue:muarr forKey:@"_aMuArray"];
    NSMutableArray *value_muArr = [aPerson mutableArrayValueForKey:@"_aMuArray"];
    NSLog(@"%@",value_muArr);
    [value_muArr addObject:@"three"];
    NSLog(@"%@",value_muArr);

系統(tǒng)還封裝了 KVC 開(kāi)關(guān) 以及 檢查

  • 如果對(duì)某個(gè)類敬鬓,不允許使用KVC淹朋,可以通過(guò)設(shè)置 accessInstanceVariablesDirectly 控制灶似。
// 在該類的內(nèi)部,重寫(xiě)此方法瑞你,外部使用KVC時(shí)酪惭,禁用沒(méi)有寫(xiě)set get 方法的屬性值。
// 注意:對(duì)于 @property 定義的屬性可以 KVC
+ (BOOL)accessInstanceVariablesDirectly{
    return NO;
}
  • 賦值檢查
// 在類的內(nèi)部者甲,進(jìn)行檢查春感,不符合要求 返回NO ,提供外部參考虏缸。
- (BOOL)validateValue:(inout id  _Nullable __autoreleasing *)ioValue forKey:(NSString *)inKey error:(out NSError * _Nullable __autoreleasing *)outError{
    
    if ([inKey isEqualToString:@"colors"] && [*ioValue isKindOfClass:[NSArray class]]) {
        return YES;
    } else {
        return NO;
    }
}
// 外部 使用時(shí)鲫懒,先判斷是否符合要求,再使用KVC刽辙。
    NSError *error;
    NSString *apoint = @"name";
    if ([aPerson validateValue:&apoint forKey:@"_colors" error:&error]) {
        NSLog(@"可以賦值 apoint");
        [aPerson setValue:apoint forKey:@"_colors"];
    } else {
        NSLog(@"不可以賦值 apoint");
        NSLog(@"%@",error.debugDescription);
    }

多重嵌套類 KVC

  • 賦值:setValue: forKeyPath:
  • 獲瓤摇:valueForKeyPath:

例如:有一個(gè)Person 類,擁有一個(gè) Cat 類宰缤。

@interface Person ()
@property (nonatomic, strong) Cat *mycat;
@end

Cat 類具有屬性 name

@interface Cat ()
@property (nonatomic, strong) NSString *name;
@end

外部使用時(shí)

    Person *aPerson = [[Person alloc] init];
    Cat *acat = [[Cat alloc] init];
    
    // 鏈接關(guān)系 非常關(guān)鍵
    [aPerson setValue:acat forKey:@"mycat"];
    
    // 路徑賦值 取值
    [aPerson setValue:@"我的貓咪" forKeyPath:@"mycat.name"];
    NSString *value_mycat_name = [aPerson valueForKeyPath:@"mycat.name"];
    NSLog(@"%@",value_mycat_name);

其他 還有重寫(xiě) 未定義的 key 颂翼,nil Value 的key 等 幾個(gè)方法。

  • 簡(jiǎn)單了解重寫(xiě)
// 多 定義了一個(gè) key 用于存 一些外部傳入沒(méi)有的key
@property (nonatomic, strong) NSString *undefineKey;

// 重寫(xiě) 取 沒(méi)有定義key 時(shí) 返回
- (nullable id)valueForUndefinedKey:(NSString *)key{
    return [self valueForKey:self.undefineKey];
}

// 重寫(xiě) 賦值沒(méi)有定義的key時(shí)慨灭,賦值
- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key{
    [self setValue:value forKeyPath:self.undefineKey];
}

// 重寫(xiě) 賦值為nil 時(shí) 朦乏,修改賦值
- (void)setNilValueForKey:(NSString *)key{
    [self setValue:@"" forKeyPath:key];
}

其他

  • 剩余一些方法 例如 :
    setValuesForKeysWithDictionary 等。待開(kāi)拓
FOUNDATION_EXPORT NSString *const NSUndefinedKeyException;

FOUNDATION_EXPORT NSString *const NSAverageKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSCountKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSDistinctUnionOfArraysKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSDistinctUnionOfObjectsKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSDistinctUnionOfSetsKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSMaximumKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSMinimumKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSSumKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSUnionOfArraysKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSUnionOfObjectsKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSUnionOfSetsKeyValueOperator;

@interface NSObject(NSKeyValueCoding)

- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
 - (NSMutableOrderedSet *)mutableOrderedSetValueForKey:(NSString *)key NS_AVAILABLE(10_7, 5_0);
 - (NSMutableSet *)mutableSetValueForKey:(NSString *)key;

- (nullable id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
- (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKeyPath:(NSString *)inKeyPath error:(out NSError **)outError;
- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath NS_AVAILABLE(10_7, 5_0);
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;

- (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;

- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;

@end

@interface NSArray<ObjectType>(NSKeyValueCoding)
 
- (id)valueForKey:(NSString *)key;

- (void)setValue:(nullable id)value forKey:(NSString *)key;

@end

@interface NSDictionary<KeyType, ObjectType>(NSKeyValueCoding)
 
- (nullable ObjectType)valueForKey:(NSString *)key;

@end

@interface NSMutableDictionary<KeyType, ObjectType>(NSKeyValueCoding)
 
- (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;

@end

@interface NSOrderedSet<ObjectType>(NSKeyValueCoding)

- (id)valueForKey:(NSString *)key NS_AVAILABLE(10_7, 5_0);
 
- (void)setValue:(nullable id)value forKey:(NSString *)key NS_AVAILABLE(10_7, 5_0);

@end

@interface NSSet<ObjectType>(NSKeyValueCoding)

- (id)valueForKey:(NSString *)key;
 
- (void)setValue:(nullable id)value forKey:(NSString *)key;

@end
 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氧骤,一起剝皮案震驚了整個(gè)濱河市呻疹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筹陵,老刑警劉巖刽锤,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異朦佩,居然都是意外死亡并思,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)吕粗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)纺荧,“玉大人,你說(shuō)我怎么就攤上這事颅筋。” “怎么了输枯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵议泵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我桃熄,道長(zhǎng)先口,這世上最難降的妖魔是什么型奥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮碉京,結(jié)果婚禮上厢汹,老公的妹妹穿的比我還像新娘。我一直安慰自己谐宙,他們只是感情好烫葬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著凡蜻,像睡著了一般搭综。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上划栓,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天兑巾,我揣著相機(jī)與錄音,去河邊找鬼忠荞。 笑死蒋歌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的委煤。 我是一名探鬼主播奋姿,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼素标!你這毒婦竟也來(lái)了称诗?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤头遭,失蹤者是張志新(化名)和其女友劉穎寓免,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體计维,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袜香,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲫惶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜈首。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖欠母,靈堂內(nèi)的尸體忽然破棺而出欢策,到底是詐尸還是另有隱情,我是刑警寧澤赏淌,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布踩寇,位于F島的核電站,受9級(jí)特大地震影響六水,放射性物質(zhì)發(fā)生泄漏俺孙。R本人自食惡果不足惜辣卒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睛榄。 院中可真熱鬧荣茫,春花似錦、人聲如沸场靴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)憎乙。三九已至票罐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泞边,已是汗流浹背该押。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阵谚,地道東北人蚕礼。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像梢什,于是被迫代替她去往敵國(guó)和親奠蹬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • KVC作為OC中重要的編程思想嗡午、在很多場(chǎng)景下我們都會(huì)使用囤躁,也是開(kāi)發(fā)者必須掌握的基礎(chǔ)知識(shí)。那么什么是KVC荔睹,他的實(shí)現(xiàn)...
    TyroneTang閱讀 701評(píng)論 0 1
  • KVC(Key-value coding)鍵值編碼狸演,單看這個(gè)名字可能不太好理解。其實(shí)翻譯一下就很簡(jiǎn)單了僻他,就是指iO...
    黑暗中的孤影閱讀 49,676評(píng)論 74 441
  • setValue:屬性值 forKey:屬性名: 為指定屬性設(shè)置值 valueForKey:屬性名: 獲取指定屬性...
    nalis風(fēng)閱讀 225評(píng)論 0 0
  • KVC簡(jiǎn)單介紹 KVC(Key-value coding)鍵值編碼宵距,就是指iOS的開(kāi)發(fā)中,可以允許開(kāi)發(fā)者通過(guò)Key...
    公子無(wú)禮閱讀 1,383評(píng)論 0 6
  • KVC(Key-value coding)鍵值編碼吨拗,單看這個(gè)名字可能不太好理解满哪。其實(shí)翻譯一下就很簡(jiǎn)單了,就是指iO...
    朽木自雕也閱讀 1,552評(píng)論 6 1