我正在尝试合并两个NSDictionaries:
NSDictionary *areaAttributes = [[area entity] attributesByName];
NSDictionary *gpsAttributes = [[gps entity] attributesByName];
NSMutableDictionary *combinedAttributes = [areaAttributes mutableCopy];
[combinedAttributes addEntriesFromDictionary:gpsAttributes];但会得到以下错误:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: 'The key 'latitude' is not defined for this NSKnownKeysDictionary'latitude是gpsAttributes中的一个关键字
发布于 2013-01-16 05:55:10
这里的问题是,你正在处理的不是普通的字典,而是NSKnownKeysDictionary,这是苹果在可可的各个部分使用的一个没有文档记录的类型。
如果您从SDK中转储ObjC类信息-或者,如果这听起来太可怕,请阅读someone else's version-you可以看到这实际上是NSMutableDictionary的子类,而不仅仅是NSDictionary,所以它已经是可变的,所以您的mutableCopy不是必需的。
更重要的是,如果您阅读了NSCopying和NSMutableCopying协议是如何定义的,就会发现没有什么需要mutableCopy返回与其基类可变兼容的内容;只要求它是可变的,并且与其基类不可变地兼容。这很烦人。
这里的答案是生成一个新的可变字典,并将两个NSKnownKeysDictionary对象中的键复制到其中:
NSDictionary *areaAttributes = [[area entity] attributesByName];
NSDictionary *gpsAttributes = [[gps entity] attributesByName];
NSMutableDictionary *combinedAttributes = [NSMutableDictionary dictionaryWithCapacity:20];
[combinedAttributes addEntriesFromDictionary:areaAttributes];
[combinedAttributes addEntriesFromDictionary:gpsAttributes];(显然,如果您担心性能,要么调整20,要么从每个字典中获取键的计数并传入总数。但通常情况下,这并不重要。)
你可能想知道苹果为什么要这么做。但如果你仔细想想,这是一件很方便的事情。在某些库的内部,您有一个可以像C struct一样使用的对象,但在外部看起来就像一个NSDictionary。(目的类似于Python中的namedtuple。)返回它们的方法都被设计成返回NSDictionary,而不是NSMutableDictionary,所以没有人会知道它们有一组受限的键。当然,如果他们调用mutableCopy的话除外。
您可能还想知道如何提前知道这一点。好吧,你真的不能。要么你记录对象的类型,你写一个异常处理程序并记录异常,要么你让它崩溃并在崩溃转储中找到异常。或者,您可以防御性地假设任何字典都可以给您一个无用的mutableCopy,并将其浅复制到您控制的类型的字典中。
https://stackoverflow.com/questions/14331715
复制相似问题