2011-02-12 8 views
7

のObjective-Cのようなディレクティブを持っています洗練されたマルコやコードジェネレータのようなものです。コード生成の目的でカスタムディレクティブを作成することは可能ですか? 1つの可能な使用法は、CoreDataのためのメソッドを生成することです。Objective-Cでカスタムディレクティブを作成できますか?私が考える</p> <ul> <li>@interface</li> <li>@implementation</li> <li>@end</li> <li>@protocol</li> <li>@property</li> <li>@synthesize</li> </ul> <p>:

私はそれについて何も見たことがないので、私は考えていませんが、私の世界は世界ではありません。


フォロー質問:

ジョナサンは、あなた自身のプリプロセッサを書き込むことが可能であり、これはどのように質問を頼むことを以下に述べます。現在、#define SYMBOLIC_CONSTANT 102は、ファイルがコンパイラに移る前に、文字SYMBOLIC_CONSTANTのすべてのインスタンスをファイルの文字102に置き換えます。

私はXCodeを知っているので、 "スクリプトフェーズの実行"をターゲット構築プロセスに追加することができます。だから私は '$ coredata'のような私のカスタム前処理ディレクティブを見つけるためのスクリプトを書くことができ、$ coredataの文字で置き換えられた新しいファイルをスクリプトに生成させることができます。しかし、私がXCodeのビルドプロセスについて理解していることから、変更されたファイルをコンパイラソースフェーズに供給することはできません。ファイルはIDEによって指定され、ロックされます。

誰かが似たようなことをしましたか?私はそれが外部ビルドシステムで可能であることを知っていますが、正直言って私はその理解レベルではありません。ビルドと実行ボタンの技術的な詳細はわかりません。一方

、私はAppleのXCodeのドキュメント...応答の

感謝の読み込みを開始します!

+0

私は遠隔操作が簡単だとは言いませんでした。しかし、 '$ coredata'のようなものは有効なCプリプロセッサトークンです(' $ 'はシンボル/マクロ名で使用できます)ので、'#define'文で使用できます。繰り返しますが、あなたの目標を教えてくれれば、問題へのより簡単で良いアプローチを提案することができます。 –

答えて

3

あなたの考えは正しいです:あなたのコードでこれを行うことは不可能です。 @ディレクティブを追加する唯一の方法は、コンパイラ自体です。あなたがそのようなトラブルに遭ったとしても、それらの構文の強調表示がどこかのXcode設定ファイルにハードコードされていることをほぼ保証することができます。

ああ、プリプロセッサマクロの使用を検討していた場合は、@という文字はプリプロセッサマクロでは不正です。

編集:私はテストを実行し、私は正しいです。 Cプリプロセッサマクロで@文字を使用することはできません。変数名と同じ規則に従います。

+2

プリプロセッサマクロの使用については言及しませんでした。私の答えを読んでください。 –

3

あなたはObjective-Cの範囲内であることを意味しますか?いいえ、新しいキーワードを認識することはできません。 @whateverを検出するプリプロセッサを記述してコードに変換することもできますが、具体的に何をしたいかを教えてくれれば、より効率的または最適なアプローチを提案することができます。

+1

Cプリプロセッサマクロで@文字は不正です。 –

+0

お返事ありがとうございます。あなたは私にこのやり方のアイデアをくれました。コードを生成するために言語フックが必要ないことを忘れてしまった。 – Tobias

+2

@Carter:私はプリプロセッサを書く*とは言いません*組み込みのものを使用しない*。独自のカスタムプリプロセッサが必要なコードを使用したいとは思いません。 (ああ、私はObjective-Cを毎日使っています...) –

0

これはできません。これらはObjective-C言語に組み込まれたキーワードです。それらの前に@があるだけで、他のキーワードと異なることはありません。

5

答えが正しいとはいえ、この種の問題には部分的にハックの解決策がありますが、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); 

ライブラリの作者はhereそれを説明する:

this codeは、あなたがそこに次のような定義があります考えてみましょう

マクロは@ preと一緒に使用されることが意図されているので(@strongify(self);のように) を返すと、try {}はシンボルを吸収して、 がシンタックスエラーを起こさないようにします。後で

From now on libextobjcは "シンボルを吸い取る" に@autoreleasepoolを使用して更新


+0

*一息、恐ろしいハックオーリーの素晴らしい説明 – TheCodingArt

関連する問題