Objective c iPhone:无法理解以下代码

Objective c iPhone:无法理解以下代码,objective-c,cocoa-touch,cocoa,objective-c-blocks,Objective C,Cocoa Touch,Cocoa,Objective C Blocks,我下载了一些示例代码。但我发现了奇怪的编码,或者可能是我第一次看到它 有人能帮我理解下面的代码吗 NSArray *wordStrings = [response.spellingSuggestions wn_map: ^id (id obj) { return [obj word]; }]; 这是块构造。参见,例如,这是Objective-C的块构造。 从人的角度来看,该代码的含义如下: 以填充有对象的数组为例 从它开始构建一个新数组,其中新数组的每个项都通过建议的匿名方法(即^ch

我下载了一些示例代码。但我发现了奇怪的编码,或者可能是我第一次看到它

有人能帮我理解下面的代码吗

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

这是块构造。参见,例如,

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

以填充有对象的数组为例 从它开始构建一个新数组,其中新数组的每个项都通过建议的匿名方法(即^character后面的所有内容)创建旧项的映射 因此,如果response.spellingSuggestions对象是NSArray的一个实例,其中填充了响应方法word的对象,那么您将获得一个新数组,其中每个对象都是[obj word]调用的结果。例如,您可以使用此方法转换相应字符串描述列表中的对象列表

使现代化 如@Steven在其回答中所述,您可以在上找到有关块构造的更多信息


希望这有帮助

让我们从内到外把它分开

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

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

^id (id obj) {
    return [obj word];
}
这里的事情变得有趣起来

这是一个街区。让我们拆开它:

^这是一个街区! id:返回类型。此块返回一个对象指针id。 id obj:参数。它采用1,这是消息表达式中用作接收器的obj变量。正如我们可以从它的名字猜到的,正如这里明确指出的,它也是一个对象指针。 {…}:块的主体。 因此,一个块获取一个对象并返回一个对象

[response.spellingSuggestions wn_map: ^id (id obj) {
    return [obj word];
}]
该块被传递到wn_map:message。让我们在这个消息表达式的另一端向内钻取:

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

或者响应可以是一个结构,而这个表达式可以是一个结构成员访问,但在现代Objective-C代码中,这是不可能的。只有你知道,因为你没有显示回复声明。如果其类型为id或someObjectiveClass*,则这是一个消息表达式。如果它的类型是其他类型,有或没有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_图的另一种写法是:我认为它应该是:

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

前者将后者作为其工作的一部分,前者还将使用valueForKey:获取response.spellingSuggestions,而不是像原始代码和后一版本那样发送[response-spellingSuggestions]


假设spellingSuggestions返回一个NSArray,那么发送给该数组的这个valueForKey:消息将执行与wn_map:和block:相同的操作,将单词message发送给每个建议,并将结果收集到一个新数组中,即分配给wordStrings的数组。

为什么要在所有大写字母中添加COCOA?这不是一个缩略词。对一个相当单薄的问题的令人惊讶的彻底回答
NSArray *wordStrings = [response valueForKeyPath:@"spellingSuggestions.word"];
NSArray *wordStrings = [response.spellingSuggestions valueForKey:@"word"];