iPhone:无法理解以下编码

时间:2011-05-10 09:47:44

标签: objective-c cocoa-touch cocoa objective-c-blocks

我已经下载了一些示例编码。但我发现奇怪的编码或者我第一次看到它。

有人可以帮我理解编码吗?

NSArray *wordStrings = [response.spellingSuggestions wn_map: ^id (id obj) {
    return [obj word];
}];

3 个答案:

答案 0 :(得分:46)

让我们从内到外将它分开。

[obj word]

带有选择器word的消息,指针位于变量obj中的对象。

return [obj word];

返回该消息返回值的语句。

^id (id obj) {
    return [obj word];
}

这里的事情很有趣。

这是一个块。让我们把它拆开:

  • ^:这是一个块!
  • id:返回类型。该块返回一个对象指针(id)。
  • (id obj):参数。它需要一个,它是用作消息表达式中的接收者的obj变量。正如我们可以从它的名字中猜出的那样,这里也是明确的,它也是一个对象指针。
  • { … }:街区的主体。

所以,一个块占用一个对象并返回一个对象。

[response.spellingSuggestions wn_map: ^id (id obj) {
    return [obj word];
}]

该块传递给wn_map:消息。让我们向内钻取,在此消息表达式的另一端:

response.spellingSuggestions

这实际上是另一个消息表达式。它将spellingSuggestions消息发送到其指针位于response变量中的对象。这种表达式称为属性访问表达式,因为spellingSuggestions应该是一个正式属性(用@property声明),但最终它只是另一个Objective-C消息。

或者response可以是一个结构,这个表达式是一个结构成员访问,但在现代的Objective-C代码中,这是不太可能的。只有你知道,因为你没有显示response的声明。如果其类型为idSomeObjectiveCClass *,则这是一个消息表达式。如果它的类型是其他类型,有或没有struct关键字但绝对没有*,那么它是一个结构成员访问表达式。

无论哪种方式,这个表达式都会计算出一个对象指针,可能是一个以某种方式封装或列出拼写建议的对象。

[response.spellingSuggestions wn_map: ^id (id obj) {
    return [obj word];
}]

...然后您将wn_map:消息发送到,传递该块。我猜想wn_map:方法会为每个拼写建议调用块...

NSArray *wordStrings = [response.spellingSuggestions wn_map: ^id (id obj) {
    return [obj word];
}];

...并返回指向NSArray的指针,您可以使用它初始化wordStrings变量。


顺便提一下,写这个的另一种方式(假设wn_map:做了我认为它做的事情)本来就是:

NSArray *wordStrings = [response valueForKeyPath:@"spellingSuggestions.word"];

或:

NSArray *wordStrings = [response.spellingSuggestions valueForKey:@"word"];

前者将后者作为其工作的一部分(前者也将使用valueForKey:来获取response.spellingSuggestions,而不是仅仅发送[response spellingSuggestions]作为原始代码而后者修订版)。

假设spellingSuggestions返回一个NSArray,该valueForKey:消息到该数组将与wn_map:和块相同:向每个建议发送word消息,并将结果收集到一个新数组中 - 您指定给wordStrings的数组。

答案 1 :(得分:7)

这是Objective-C的块构造。 从人类的角度来看,这段代码的含义如下:

  1. 获取一个充满对象的数组
  2. 从它开始构建一个新数组,其中新数组的每个项目都通过建议的匿名方法创建“映射”旧项目(即所有在^字符之后)
  3. 因此,如果response.spellingSuggestions对象是填充了响应方法NSArray的对象的word实例,您将获得一个新数组,其中每个对象都是[obj word]致电。例如。您可以使用此方法转换相应字符串描述列表中的对象列表。

    更新

    您可以在Apple Developer reference page找到有关块结构的更多信息,如@Steven在其答案中所述。

    希望这有帮助

答案 2 :(得分:2)