为啥会出现错误:类与键名的键值编码不兼容?
Posted
技术标签:
【中文标题】为啥会出现错误:类与键名的键值编码不兼容?【英文标题】:Why getting error: class is not key value coding-compliant for the key name?为什么会出现错误:类与键名的键值编码不兼容? 【发布时间】:2020-03-29 15:58:14 【问题描述】:正如 Xcode 自动完成建议中所建议的,在目标 c 中使用以下代码会产生运行时错误,
for (int i = 1; i <= 10; i++)
NSLog(@"%d", i);
NSDictionary *dic = [[NSDictionary alloc] init];
[dic setValue:@"Alex" forKey:@"name"];
[dic setValue:@"45" forKey:@"Age"];
2020-03-29 21:55:34.588607+0600 测试[5299:15492347] *** 终止 应用程序由于未捕获的异常“NSUnknownKeyException”,原因: '[<__nsdictionary0> setValue:forUndefinedKey:]: 这个 类与键名的键值编码不兼容。'
我错过了什么?
更新
正如matt 所评论的NSDictionary
是不可变的,那么,
为什么 setValue
方法可用于 Xcode 上自动完成建议中的 NSDictionary?
为什么不能在编译时而不是运行时检测到修改非可变集合的方法?
【问题讨论】:
“我错过了什么?”一切。 NSDictionary 是不可变的。你不能在里面设置任何东西。此外,setValue
是错误的机制。基本上,该代码的任何内容都是正确的。
是KVC。这里不需要 KVC。只需致电setObject
。当然,你不能,因为这不是一个可变字典。但这就是重点。
"NSDictionary 是不可变的,那为什么 NSDictionary 可以使用 setValue 方法" 因为它是 NSObject 上的一个类别。所有类都继承它。但这并不意味着您可以使用它来尝试解决类不可变的事实。所有类都继承copy
,但并非所有类都符合 NSCopying。以此类推。
它确实删除了它。这就是异常告诉你的。
因为它是一个NSObject方法。
【参考方案1】:
我通过将setValue
更改为setObject
来解决此问题,
NSDictionary *dic = [[NSDictionary alloc] init];
[dic setObject:@"Alex" forKey:@"name"];
[dic setObject:@"45" forKey:@"Age"];
【讨论】:
以上是关于为啥会出现错误:类与键名的键值编码不兼容?的主要内容,如果未能解决你的问题,请参考以下文章
iOS/Facebook 登录错误:此类与键的键值编码不兼容