为啥会出现错误:类与键名的键值编码不兼容?

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 登录错误:此类与键的键值编码不兼容

此类与键错误的键值编码不兼容

此类与键视图的键值编码不兼容

如何修复错误:此类与键 tableView 的键值编码不兼容。 [复制]

该类与键 tableView 的键值编码不兼容