2012-05-11 7 views
2

NSStringにNSString値を追加したいとします。私はほとんどそれが#defineを使用することができますが、私はアクセスし、その宣言された変数を初期化する方法を理解していないと確信しています。 は、例えば、私が持っている:NSArrayを定義するには?

#define my_definition 0; 

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

私はdefinitions.hファイルを持っています。そこには私のクラスからのアクセスがあります。

答えて

4

お元気です...あなたはここで何をしようとしていますか?

#defineはプリプロセッサマクロです。プリプロセッサはObjective-C(またはその点ではC)については何も知らないが、それは単なる文字通りのテキスト置換エンジンである。Objective-Cはプリプロセッサについて何も知らない。

あなたはほぼ確実に多分数値(例えばint S)またはNSString以外で#defineを望んでいません。 (実際には、あなたは通常、あまりにも、さまざまな理由で#defineの代わりにextern NSString * ...が表示されます。)

あなたがオブジェクト内の特定のNSArrayにアクセスする必要がある場合、あなたは-initかに移入IVARを作成することができます好き。他のクラスが配列にアクセスする必要がある場合は、@propertyにするか、(public)メソッドを宣言するだけです。

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

+0

いいえ、ありがとう!それはたくさんのことを説明しています。私は最初に間違った方法で自分の問題を見ています。 – Kuba

0
#define MY_DEFINITION @[ @"String1", @"String2" ] 

あなたがに#defineを使用する場合は好ましくはセミコロン

+1

Xcodeのプロダクションリリースではまだ利用できない新しいコレクションリテラルが必要と考えています。 –

+0

@Tom or Conrad:コレクションリテラルはどこで読んだのですか?私は年齢のためにこれについてアップルを盗んできており、彼らはかなり一般的な要求であると答えた。これはずっと前に言語に組み込まれていたはずですが、私のポストから見ることができるように、自分自身をロールバックすることは可能です(言語機能ほど優雅ではありませんが、まだ実行可能です)。 – par

+0

@parマウンテンライオン開発者のプレビューでNDAの下で公開されましたが、llvm.org(IIRC)の新しいコンパイラビルドで公開されました。 –

2

せずに、あなたはプリプロセッサマクロを定義します。グローバル変数ではありません。マクロを使用する場所ではなく、#defineの後ろに置き換えられ、コードがコンパイルされます。言われていること

、あなたは単にあなたがどこか別の場所と同じようにNSArrayを定義することができます。私は、セミコロンで行を終了しなかったことを

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

お知らせを。私は今、自分のコードのどこかに書いた場合を想像:

NSString *str1 = [kMyArray objectAtIndex:0]; 

これ

が置き換えられます:私は私の定義では、セミコロンを持っていた場合、私はコンパイルエラーになるだろう

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

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")); 

は、タイピングの全体多くを保存します。 !

+0

参考までに、この回答は本当に古いです。これを投稿した後に開発されたObjective-Cの配列リテラル構文を使用します(例: 'NSArray * array = @ [@" foo "、@" bar "、@" baz "];' – par

関連する問題