为啥在可变字典上调用的 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 不会为未知键路径抛出异常?的主要内容,如果未能解决你的问题,请参考以下文章

Python基础_列表元祖和字典

为啥函数调用在 swiftui 中返回不可变值时出现错误?

有没有办法使用 setValue:forKey 来获取 C 类型的变量?

为啥不能在 Redshift 的 CTE 的某些子句中调用不可变的 UDF?

不能对不可变值使用变异成员:函数调用返回不可变值 - 不确定为啥值是不可变的

C# 有办法给我一个不可变的字典吗?