3

NSString 値を含む NSArray を追加したいと考えています。私はそれを使用できるとほぼ確信してい#defineますが、その宣言された変数にアクセスして初期化する方法がわかりません。たとえば、私は持っています:

#define my_definition 0;

そして、この 0 値にアクセスする方法を知っています。しかし、NSArray 内の NSString はどうですか?

私は definitions.h ファイルを持っています。そこでは、どのクラスからでもアクセスできます。

4

4 に答える 4

5

おっと... ここで何をしようとしているのですか?

#defineプリプロセッサ マクロです。プリプロセッサは、Objective-C (またはその点については C... それはただの美化されたテキスト置換エンジンです) について何も知らず、Objective-C はプリプロセッサについて何も知りません。

おそらく#define数値(例: sint ) またはNSString. (実際には、通常、さまざまな理由extern NSString * ...で代わりに表示されます。)#define

オブジェクト内の特定のものにアクセスする必要がある場合はNSArray、移入する ivar などを作成できます-init。他のクラスが配列にアクセスする必要がある場合は、それを にする@propertyか、単に (パブリック) メソッドを宣言します。

多分私はあなたがやろうとしていることを誤解していますか?

于 2012-05-11T09:02:48.777 に答える
4

#define を使用すると、プリプロセッサ マクロが定義されます。これはグローバル変数ではありません。代わりに、そのマクロを使用する場所はどこでも #define の後にあるものに置き換えられ、その後でのみコードがコンパイルされます。

そうは言っても、他の場所と同じように NSArray を簡単に定義できます。

#define kMyArray [NSArray arrayWithObjects:@"MyString1", @"MyString2", nil]

行末にセミコロンを付けていないことに注意してください。コードのどこかに次のように書いたとします。

NSString *str1 = [kMyArray objectAtIndex:0];

これは次のものに置き換えられます。

NSString *str1 = [[NSArray arrayWithObjects:@"MyString1", @"MyString2", nil] objectAtIndex:0];

定義にセミコロンがあると、コンパイラ エラーが発生します。

于 2012-05-11T09:00:32.153 に答える
2

数か月前に、主に多くのタイピングを節約するために、自分の目的に適合させた他の誰かのコードに出くわしました。元の作者に事前にお詫び申し上げます。当然のことながらクレジットを表示したいと思いますが、ハード ドライブを調べてみたところ、元のサンプルも彼または彼女の名前も見つかりませんでした。元のソースに出くわした場合は、この投稿を元の作成者の名前で修正します.

いずれにせよ、基本的な考え方は、$ 文字をマクロのプレフィックス文字として使用し、可変引数を取ることです。はい、gcc と Apple の LLVM コンパイラの両方がこれをサポートしています。私は完全に夢中になり、いくつかの例に基づいてほぼすべてのコア型 (配列、文字列、日付、辞書など) を変換しましたが、次のアイデアを参考にしてください。

#define $string( _format, _args... )        ( [NSString stringWithFormat: ( _format ), _args] )
#define $stringUTF8( _format, _args... )    ( [[NSString stringWithFormat: ( _format ), _args] UTF8String] )

// shorthand container creation (NSArray, NSMutableArray)
#define $array( _objs... )                  ( { id objs[] = { _objs }; [NSArray arrayWithObjects: objs count: sizeof(objs) / sizeof(id)]; } )
#define $arrayM( _objs... )             ( { id objs[] = { _objs }; [NSMutableArray arrayWithObjects: objs count: sizeof(objs) / sizeof(id)]; } )

これにより、次のようないくつかのきちんとしたことができます。

NSArray *           array;

array = $array( @"foo", @"bar", $string( @"This is a %@ string", @"formatted" ) );

タイピングの手間を大幅に省けます!

于 2012-05-11T09:27:12.013 に答える
0
#define MY_DEFINITION @[ @"String1", @"String2" ]

できればセミコロンなし

于 2012-05-11T08:57:34.457 に答える