Ответ 1
Позвольте разбить его, изнутри наружу.
[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
.