7 votes

Est-il possible de créer des directives personnalisées en Objective-C?

Objective-C a des directives comme :

  • @interface
  • @implementation
  • @end
  • @protocol
  • @property
  • @synthesize

Je pense à ces choses comme des macros sophistiquées ou des générateurs de code. Est-il possible de créer des directives personnalisées à des fins de génération de code ? Une utilisation possible est la génération de méthodes pour CoreData.

Je pense que non, car je n'ai jamais rien vu à ce sujet, mais mon monde n'est pas le monde.


Question de suivi :

Jonathan a mentionné ci-dessous qu'il est possible d'écrire votre propre préprocesseur et cela soulève la question de savoir comment. Actuellement, #define CONSTANT_SYMBOLIQUE 102 remplacera toutes les instances des caractères SYMBOLIC_CONSTANT par les caractères 102 dans le fichier avant que les fichiers ne passent au compilateur.

Je sais qu'à XCode, vous pouvez ajouter une "Phase de script d'exécution" au processus de génération des cibles. Ainsi, je pourrais écrire un script pour trouver mes propres directives de prétraitement comme '$coredata' et ensuite avoir le script générer un nouveau fichier avec les caractères $coredata remplacés par certains caractères de code. Mais de ce que je comprends du processus de génération de XCode, vous ne pouvez pas alimenter des fichiers modifiés dans la phase Sources du compilateur. Les fichiers sont spécifiés et verrouillés par l'IDE.

Quelqu'un a-t-il fait quelque chose de similaire ? Je sais que c'est possible avec un système de génération externe, mais pour être honnête, je n'ai pas ce niveau de compréhension. Je ne connais pas les détails techniques de ce que fait le bouton Générer et Exécuter.

En attendant, je vais commencer à lire la documentation d'Apple sur XCode...

Merci pour les réponses !

5voto

Stanislaw Points 670

Alors que la réponse acceptée est correcte, il existe une solution partielle de bricolage à ce genre de problème, que la bibliothèque libextobjc adopte. Considérez ce code, vous y trouverez les définitions suivantes :

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

Une telle définition permet l'utilisation du mot-clé weakify sous la forme suivante :

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

@weakify(foo, bar);

L'auteur de la bibliothèque l'explique ici :

Comme les macros sont destinées à être utilisées avec un @ les précédant (comme @strongify(self);), le try {} absorbe le symbole pour éviter des erreurs de syntaxe.


Mise à jour ultérieure

Désormais, libextobjc utilise @autoreleasepool pour "absorber le symbole".

3voto

Jonathan Grynspan Points 32291

Vous voulez dire dans les limites de Objective-C? Non, car il n'a aucun moyen de reconnaître vos nouveaux mots clés. Vous pourriez écrire un préprocesseur pour détecter @whatever et le convertir en code, mais si vous nous dites ce que vous aimeriez spécifiquement faire, nous pourrions suggérer une approche plus efficace ou plus optimale.

3voto

Carter Allen Points 1743

Votre réflexion est correcte : il est impossible de le faire dans votre code. La seule façon d'ajouter plus de @-directives est via le compilateur lui-même. Même si vous vous donnez tout ce mal, je peux presque garantir que le support de coloration syntaxique pour eux est codé en dur dans un fichier de configuration Xcode quelque part.

Oh, et si vous envisagiez d'utiliser une macro de préprocesseur, il me semble que le caractère @ est illégal dans les macros de préprocesseur.

Édition : J'ai fait un test, et j'ai raison. Utiliser le caractère @ dans une macro de préprocesseur C est illégal. Ils suivent la même règle que les noms de variables.

0voto

Marc W Points 13166

Il n'est pas possible. Ces mots-clés font partie intégrante du langage Objective-C. Le simple fait qu'il y ait un @ devant ne les rend pas différents des autres mots-clés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X