【问题标题】:Extracting value from NSDictionary with brackets vs. objectForKey: or valueForKey:从带有括号的 NSDictionary 中提取值与 objectForKey: 或 valueForKey:
【发布时间】:2016-10-26 05:00:07
【问题描述】:

我想知道这种便捷方法代表什么,但找不到任何答案。

theDictionary[@"key"] 在想要从字典中提取值时究竟做了什么?是用valueForKey:还是objectForKey:

什么是更好的性能明智?像[theDictionary objectForKey:@"key"]这样写整个消息更好还是方便的方法就足够了?

【问题讨论】:

标签: objective-c objective-c-literals


【解决方案1】:

NSDictionary 提供方法objectForKey: 来访问其内容。与valueForKey: 的区别在此相关问题中进行了深入解释:Difference between objectForKey and valueForKey?

[] 运算符是objectForKey: 的快捷方式。不管你用哪个都无所谓,但前者更容易阅读(代码噪音更少),意图立即清晰,你不必考虑是objectForKey:还是valueForKey:

所以就个人而言,我更喜欢[]

【讨论】:

  • 下标是objectForKeyedSubscript: 的糖,而不是直接objectForKey:。 (另外,@[] 是文字 NSArray,而不是下标:删除 @。)
  • @JoshCaswell 是的,当然没有(复制的)'@'。它最终不会调用'objectForKey:'吗?或者“objectForKeyedSubscript:”间接是否有一些副作用?
  • 正确,在NSDictionary 上,它只是直接调用objectForKey:
  • 它对可变字典中的设置器有副作用:nil 是允许的。即使这不是 Q 的明确部分,也应该这么说。
  • dict[key] = value 实际上转换为setObject:forKeyedSubscript,如果值为nil,则具有调用removeObjectForKey 的行为。这使您能够通过将 nil 分配给键来删除对象。
【解决方案2】:

让我们把它放在一个上下文中:

有不同的方法可以访问通过键访问的对象。

A.键值编码

键值编码是使用-valueForKey: 等完成的。由于这是在NSObject 中实现的,因此几乎所有具有属性(具有可通过键访问的属性)的对象都会对此做出响应。基本上,此方法从键形成一个选择器并将其发送到对象。除此之外,您还可以构建密钥路径,并且有一些特殊的密钥,即。 e.数。

这完全是在编译器之外实现的。

NSDictionary 的实例支持这一点。

B.下标

[] 是下标的语法。如果[] 之间的键是对象,则它是键控下标。编译器将该语法转换为-objectForKeyedSubscript: 等。信息。接收者必须实现这些方法。

NSDictionary 的实例通过简单地发送 -objectForKey: 等来支持这一点。到self。但有一点区别,见下文。

C. NSDictionary

另外NSDictionary 实现-objectForKey:

没有对错之分。我个人更喜欢NSDictionary-objectForKey: 等实例的最具体消息。但是,键控订阅可能更易读。

键值编码好,如果你不知道接收者的类型。

顺便说一句:键值编码和键控下标让您在 NSMutableDictionary 的实例中设置 nil 值,而 -setObject:forKey: 等。禁止这样做。

【讨论】:

    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多