首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并NSDictionaries - NSUnknownKeyException

合并NSDictionaries - NSUnknownKeyException
EN

Stack Overflow用户
提问于 2013-01-15 13:34:24
回答 1查看 5.8K关注 0票数 6

我正在尝试合并两个NSDictionaries:

代码语言:javascript
复制
NSDictionary *areaAttributes = [[area entity] attributesByName];
NSDictionary *gpsAttributes = [[gps entity] attributesByName];
NSMutableDictionary *combinedAttributes = [areaAttributes mutableCopy];
[combinedAttributes addEntriesFromDictionary:gpsAttributes];

但会得到以下错误:

代码语言:javascript
复制
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: 'The key 'latitude' is not defined for this NSKnownKeysDictionary'

latitudegpsAttributes中的一个关键字

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-16 05:55:10

这里的问题是,你正在处理的不是普通的字典,而是NSKnownKeysDictionary,这是苹果在可可的各个部分使用的一个没有文档记录的类型。

如果您从SDK中转储ObjC类信息-或者,如果这听起来太可怕,请阅读someone else's version-you可以看到这实际上是NSMutableDictionary的子类,而不仅仅是NSDictionary,所以它已经是可变的,所以您的mutableCopy不是必需的。

更重要的是,如果您阅读了NSCopyingNSMutableCopying协议是如何定义的,就会发现没有什么需要mutableCopy返回与其基类可变兼容的内容;只要求它是可变的,并且与其基类不可变地兼容。这很烦人。

这里的答案是生成一个新的可变字典,并将两个NSKnownKeysDictionary对象中的键复制到其中:

代码语言:javascript
复制
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,并将其浅复制到您控制的类型的字典中。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14331715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档