Подтвердить что ты не робот

IPhone: невозможно понять следующее кодирование

Я загрузил несколько примеров кода. Но я нашел странную кодировку или, может быть, впервые увидел ее.

Может ли кто-нибудь помочь мне понять следующее кодирование?

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

Ответ 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.

Ответ 2

Это конструкция блоков для Objective-C. Что означает этот код, с человеческой точки зрения, следующее:

  • Возьмите массив, заполненный объектами
  • Создайте новый массив, начиная с него, где каждый элемент нового массива создает "сопоставление" старого элемента с помощью предложенного анонимного метода (т.е. все, что после символа ^)

Итак, если объект response.spellingSuggestions является экземпляром NSArray, заполненным объектами, которые отвечают на метод word, вы получите новый массив, в котором каждый объект является результатом вызова [obj word]. Например. вы можете использовать этот подход для преобразования списка объектов в список соответствующего описания строки.

Update

Более подробную информацию о блочной конструкции вы можете найти на странице страницы разработчиков Apple, как указано в его ответе @Steven.

Надеюсь, что это поможет