首先不可變字典可以調(diào)起setValue:forKey:,但不能真正的進(jìn)行操作糯累,這取決與不可變字典不可增刪改的特性栗弟。
然后看一下setObject:forKey: 、 setValue:forKey: 规揪、 setValue:forKeyPath: 的標(biāo)準(zhǔn)調(diào)用語(yǔ)句:
[muDict setValue:<#(nullable id)#> forKey:<#(nonnull NSString *)#>];
[muDict setValue:<#(nullable id)#> forKeyPath:<#(nonnull NSString *)#>];
[muDict setObject:<#(nonnull id)#> forKey:<#(nonnull id<NSCopying>)#>];
明顯可以看出:
(1) setValue:forKey: 的value是可以為nil的(但是當(dāng)value為nil的時(shí)候桥氏,會(huì)自動(dòng)調(diào)用removeObject:forKey方法);
setObject:forKey: 的value則不可以為nil猛铅。
(2) setValue:forKey: 的key必須是不為nil的字符串類型字支;
setObject:forKey: 的key可以是不為nil的所有類型。
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:@{@"cs":@"test"}];
NSDictionary *testDict = @{@"name": @"test_name", @"age": @"12", @"dict":dict};
NSMutableDictionary *muDict = [NSMutableDictionary dictionaryWithDictionary:testDict];
[muDict setObject:@"object" forKey:@"key"];
[muDict setValue:@"value" forKey:@"key2"];
//此時(shí)打印結(jié)果:
{
age = 12;
dict = {
cs = test;
};
key = object;
key2 = value;
name = "test_name";
}
這里setObject:forKey:與setValue:forKey:的作用是相同的奸忽,先檢測(cè)muDict中是否存在key對(duì)應(yīng)的鍵值對(duì)堕伪,存在就直接替換原有的value,否者就插入一條新鍵值對(duì)栗菜。
[muDict setValue:@"ceshi" forKeyPath:@"dict.cs"];NSLog(@"%@", muDict);
此時(shí)打印結(jié)果:
{
age = 12;
dict = {
cs = ceshi;
};
key = object;
key2 = value;
name = "test_name";
}
這里是對(duì)muDict進(jìn)行操作欠雌,處理復(fù)合路徑dict.cs,首先檢測(cè)muDict中是否存在dict對(duì)應(yīng)的鍵值對(duì)疙筹,存在就去檢測(cè)dict中是否有cs對(duì)應(yīng)的鍵值對(duì)富俄,有則替換value禁炒,沒(méi)有創(chuàng)建鍵值對(duì),如果muDict中檢測(cè)不到dict的存在霍比,那么就停止操作幕袱。
setValue:forKey: 與 setValue:forKeyPath:
動(dòng)態(tài)設(shè)置: setValue:屬性值 forKey:屬性名(用于簡(jiǎn)單路徑)、setValue:屬性值 forKeyPath:屬性路徑(用于復(fù)合路徑悠瞬,例如Person有一個(gè)Account類型的屬性凹蜂,那么person.account就是一個(gè)復(fù)合屬性)
動(dòng)態(tài)讀取: valueForKey:屬性名 阁危、valueForKeyPath:屬性名(用于復(fù)合路徑)