为啥在可变字典上调用的 setValue:forKeyPath 不会为未知键路径抛出异常?
Posted
技术标签:
【中文标题】为啥在可变字典上调用的 setValue:forKeyPath 不会为未知键路径抛出异常?【英文标题】:Why doesn't setValue:forKeyPath invoked on mutable dictionary throw exception for unknown keypaths?为什么在可变字典上调用的 setValue:forKeyPath 不会为未知键路径抛出异常? 【发布时间】:2011-04-22 13:30:50 【问题描述】:我有以下代码:
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[defs setObject:[NSNumber numberWithInt:100] forKey:@"test1.test2.test3"];
[defs setValue:[NSNumber numberWithInt:10] forKeyPath:@"test2.test3.test4"];
我了解setObject:forKey:
在“test1.test2.test3”键和给定数字对象之间创建关联。另一方面,setValue:forKeyPath:
是键值编码方法,它试图定位路径“test2.test3.test4”的对象,但最终,它只是默默地什么都不做。它甚至不修改字典!
让我非常困惑的是setValue:forKeyPath:
没有引发任何异常,也没有报告任何错误。为什么是这样?这种行为是否记录在任何地方?
【问题讨论】:
【参考方案1】:抱歉,我找不到任何有关此特定案例的文档,但我的猜测是:
[defs setValue:x forKeyPath:@"a.b.c"];
正在实施这样的事情:
[[defs objectForKey:@"a"] setValue:x forKeyPath:@"b.c"];
所以objectForKey:
返回nil
,而在nil
上调用的方法什么也不做。这可以解释你所描述的行为。
【讨论】:
谢谢。那确实可以解释沉默:-(【参考方案2】:NSMutableDictionary *dict = [@@"test1" : [@@"test2":[@ mutableCopy] mutableCopy] mutableCopy];
[dict setValue:@(100) forKeyPath:@"test1.test2.test3"]; // ok
[dict setValue:@(200) forKeyPath:@"test1.test2.test4"]; // ok
[dict setValue:@(300) forKeyPath:@"test1.test21"]; // ok
[dict setValue:@(400) forKeyPath:@"test1.test22.test3"]; // fail, test22 not mutable
[dict setValue:[@ mutableCopy] forKeyPath:@"test1.test23"]; // ok
[dict setValue:@(500) forKeyPath:@"test1.test23.test34"]; // ok
【讨论】:
请检查此URL 它将有助于提高您的内容质量以上是关于为啥在可变字典上调用的 setValue:forKeyPath 不会为未知键路径抛出异常?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法使用 setValue:forKey 来获取 C 类型的变量?
为啥不能在 Redshift 的 CTE 的某些子句中调用不可变的 UDF?