Можно ли создавать пользовательские директивы в Objective-C? - PullRequest
7 голосов
/ 12 февраля 2011

Objective-C имеет следующие директивы:

  • @ interface
  • @ реализация
  • @ end
  • @ протокол
  • @ property
  • @ synthesize

Я думаю о таких вещах, как сложные marco или генераторы кода.Можно ли создавать собственные директивы для целей генерации кода?Одним из возможных применений является генерация методов для CoreData.

Я думаю, что нет, потому что я никогда ничего не видел об этом, но мой мир не мир.


Дополнительный вопрос:

Джонатан упомянул ниже, что можно написать свой собственный препроцессор, и возникает вопрос о том, как.В настоящее время #define SYMBOLIC_CONSTANT 102 заменит все экземпляры символов SYMBOLIC_CONSTANT на символы 102 в файле, прежде чем файлы перейдут в компилятор.

Я знаю, что в XCode вы можете добавить «Фазу запуска сценария»Целевой процесс сборки.Таким образом, я мог бы написать скрипт, чтобы найти мои пользовательские директивы препроцессора, такие как '$ coredata', и затем заставить скрипт генерировать новый файл, в котором символы $ coredata заменены некоторыми символами кода.Но из того, что я понимаю в процессе сборки XCode, вы не можете подавать измененные файлы в фазу источников компиляции.Файлы указаны и заблокированы IDE.

Кто-нибудь делал что-то подобное?Я знаю, что это возможно с внешней системой сборки, но, честно говоря, я не на этом уровне понимания.Я не знаю технических подробностей о том, что делает кнопка Build and Run.

А пока я начну читать документацию Apple XCode ...

Спасибо за ответы!

Ответы [ 4 ]

5 голосов
/ 24 июля 2013

Несмотря на то, что принятый ответ является правильным, существует частичное хакерское решение этой проблемы, которое принимает библиотека libextobjc .Рассмотрим этот код , там вы найдете определения, подобные следующим:

#define weakify(...) \
    try {} @finally {} \
    metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__)

Такое определение позволяет использовать ключевое слово weakify в следующей форме:

id foo = [[NSObject alloc] init];
id bar = [[NSObject alloc] init];

@weakify(foo, bar);

Автор библиотеки объясняет это здесь :

Поскольку макросы предназначены для использования с предшествующим им @ (например, @strongify (self);),try {} впитывает символ, поэтому он не вызывает синтаксических ошибок.


Обновлено позже

С этого момента libextobjc использует @autoreleasepool для «впитывания символа».

3 голосов
/ 12 февраля 2011

Ваше мышление верно: это невозможно сделать в вашем коде. Единственный способ добавить дополнительные директивы @ - через сам компилятор. Даже если вы пошли на все эти неприятности, я почти гарантирую, что поддержка подсветки синтаксиса для них жестко запрограммирована где-то в файле конфигурации Xcode.

О, и если вы рассматривали возможность использования макроса препроцессора, я понимаю, что символ @ недопустим в макросах препроцессора.

Редактировать: я провел тест, и я прав. Использование символа @ в макросе препроцессора C недопустимо. Они следуют тому же правилу, что и имена переменных.

3 голосов
/ 12 февраля 2011

Вы имеете в виду в рамках Objective-C? Нет, так как он не может распознать ваши новые ключевые слова. Вы можете написать препроцессор для обнаружения @whatever и преобразовать его в код, но если вы сообщите нам, что конкретно вы хотите сделать, мы можем предложить более эффективный или оптимальный подход.

0 голосов
/ 12 февраля 2011

Это невозможно.Это ключевые слова, встроенные в язык Objective-C.То, что перед ними стоит @, не отличает их от других ключевых слов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...