NSDictionary不符合键值编码的“Test”键。

11

我正在尝试以一种方式使用NSDictionary,使得我能够将NSArrays存储在其中,但是我甚至无法让它对字符串起作用。

_times = [[NSDictionary alloc] init];
NSString *test = @"Test";
[_times setValue:@"testing" forKey:test];
NSLog(@"%@",[_times objectForKey:test]);
对于上面的代码,我收到错误消息:
Terminating app due to uncaught exception 'NSUnknownKeyException',reason: '[<__NSDictionaryI 0x8b86540> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key Test。'

为什么NSString *不能作为键?实际上,这正是该方法要调用的。

留下我的5分钱,以防有人在使用setValue:forKeyPath:时遇到此错误,您应该知道:
  • 即使您的顶级字典对象可能是可变的(NSMutableDictionary),
  • 您尝试通过keyPath访问的那个对象仍然可能是不可变的(NSDictionary),
这会导致上述错误。
- SudoPlz
2个回答

26

NSDictionary 是不可变的,因此您无法设置其值。
请使用 NSMutableDictionary

NSMutableDictionary *times = [[NSMutableDictionary alloc] init];

我在这里包含 @Martin 的评论

此外:使用 setObject:forKey 来设置字典值。 setValue:forKey 仅在"键-值编码"的魔法中需要。如果应用于不可变字典,则 setObject:forKey 还将提供更好的错误消息。


2
@Inbl: 另外:使用setObject:forKey来设置字典值。setValue:forKey仅在“键-值编码魔法”时需要。如果应用于不可变字典,setObject:forKey也会提供更好的错误消息。 - Martin R
1
@Inbl 这当然是正确的,但这并没有完全解决原始问题。 当您使用字典时,请确保调用-setObject:forKey:而不是-setValue:forKey:-setValue:forKey:是保留给键值编码的,使用前者会使您在编译时出现错误而不是运行时错误。 - Hyperbole

2
此外,对于字典来说,KVC 是设置键值对的一种低效方式。更好的方法是使用 NSMutableDictionary 的 setObject:forKey: 方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接