我已经下载了一些示例编码。但我发现奇怪的编码或者我第一次看到它。
有人可以帮我理解编码吗?
NSArray *wordStrings = [response.spellingSuggestions wn_map: ^id (id obj) {
return [obj word];
}];
答案 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
的声明。如果其类型为id
或SomeObjectiveCClass *
,则这是一个消息表达式。如果它的类型是其他类型,有或没有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的块构造。 从人类的角度来看,这段代码的含义如下:
^
字符之后)因此,如果response.spellingSuggestions
对象是填充了响应方法NSArray
的对象的word
实例,您将获得一个新数组,其中每个对象都是[obj word]
致电。例如。您可以使用此方法转换相应字符串描述列表中的对象列表。
您可以在Apple Developer reference page找到有关块结构的更多信息,如@Steven在其答案中所述。
希望这有帮助
答案 2 :(得分:2)