我已经下载了一些示例代码。但是我发现了奇怪的编码或者我可能是第一次看到它。
谁能帮我理解下面的代码?
NSArray *wordStrings = [response.spellingSuggestions wn_map: ^id (id obj) {
return [obj word];
}];
最佳答案
让我们从内到外拆开它。
[obj word]
带有选择器 word
的消息指向其指针在变量 obj
中的对象。
return [obj word];
返回该消息返回值的语句。
^id (id obj) {
return [obj word];
}
事情变得有趣了。
这是一个 block 。让我们拆解它:
^
:这是一个 block !id
:返回类型。此 block 返回一个对象指针 (id
)。(id obj)
:参数。它需要一个,即在消息表达式中用作接收者的obj
变量。我们可以从它的名字中猜到,正如这里明确指出的那样,它也是一个对象指针。{ … }
: block 的主体。
因此,一个 block 获取一个对象并返回一个对象。
[response.spellingSuggestions wn_map: ^id (id obj) {
return [obj word];
}]
该 block 被传递给 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:
消息发送到,传递 block 。我猜 wn_map:
方法将为每个拼写建议调用该 block ......
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:
和 block 相同的操作:发送word
消息到每个建议,并将结果收集到一个新数组中——您分配给 wordStrings
的数组。
关于objective-c - iPhone : Unable to understand the following coding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5948202/