20

Objective C での文字列リテラルの省略形の@"string"表記法が気に入っています。sで同様の動作を得る方法はありますNSNumberか? 私はもっ​​と番号を扱うので、[NSNumber numberWithWhatever:]どこにでも電話をかけるのはとても面倒です。マクロを作成しても機能しますが、それを行う最善の方法についての私の知識は限られています。

4

4 に答える 4

31

Clang v3.1の時点で、Objective-C リテラルを使用できるようになりました。

NSNumber *fortyTwo = @42;             // equivalent to [NSNumber numberWithInt:42]
NSNumber *fortyTwoUnsigned = @42U;    // equivalent to [NSNumber numberWithUnsignedInt:42U]
NSNumber *fortyTwoLong = @42L;        // equivalent to [NSNumber numberWithLong:42L]
NSNumber *fortyTwoLongLong = @42LL;   // equivalent to [NSNumber numberWithLongLong:42LL]

だから、あなたの特定の質問に答える:

[Tyler setArms:[[[NSNumber alloc] initWithInt:1] autorelease]];

次のように記述できるようになりました。

[Tyler setArms:@1];

配列と辞書のリテラルもありますが、この質問の範囲外です。

Xcode でリテラルを利用するには、少なくともバージョン 4.4 が必要です。これには、Apple の LLVM 4.0 コンパイラが付属しています。

于 2012-06-20T13:14:07.293 に答える
9

私は次のようなマクロを使用しています

#define N(x) [NSNumber numberWithInt: x]

のようなコードにつながる

[N(123) intValue];

アップデート:

このようなマクロのCPUとメモリの消費量に注意する必要があります。@"…"文字列は静的なコンパイラで生成された定数文字列クラスの文字列ですが(おそらくCocoaの基盤に依存しますNSConstantStringか?)、マクロは実行時に評価されるコードを作成するため、呼び出されるたびに新しいオブジェクトを作成します。

于 2010-09-20T12:47:47.683 に答える
7

Xcode 4.4 では、rjstellingNSNumberが、NSArrayおよびのリテラルについて言及した Clang 機能が導入されましたNSDictionary。構文は単純です。

//Number literal
NSNumber *pi = @3.14;

//Array literal
NSArray *primes = @[ @2, @3, @5, @7, @11 ]; //No nil terminator needed

//Dictionary literal
NSDictionary *dict = @{
    @"key1": @42,
    @"key2": @"Another key",
    @3: @"A NSNumber key"
}; //No nil terminator, stored in "key:value," format
于 2012-07-25T17:56:20.847 に答える