objective-c - iPhone : Unable to understand the following coding

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

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

谁能帮我理解下面的代码?

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 的声明。如果它的类型是idSomeObjectiveCClass *,这是一个消息表达式。如果它的类型是其他东西,有或没有 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/

相关文章:

objective-c - 在 NSMutableDictionary 中存储自定义对象

ios - NSMakeRange(i, 1) 是什么意思?

objective-c - 初始化 NSMutableArray : [NSMutableArray array];

cocoa - 自定义 NSSharingService 窗口示例

iphone - AFNetworking UIImageView 需要滚动来加载图像

objective-c - 在 Mac OS X 中以编程方式更改窗口高度超过屏幕高度

ios - 如何获取IOS模拟器的应用目录?

objective-c - 带有文本字段 : how to dismiss if RETURN is pressed and how to hide keyboard if dismissed? 的 UIAlertView

cocoa-touch - 出现UITextField或UITextView的键盘时调整界面

objective-c - NSTokenField 点击完成列表项