6

Objective-Cには新しいNSNumberリテラルがあり、たとえば次のように使用できます。

NSNumber *n1 = @1000;  // [NSNumber numberWithInt:1000]

しかし、列挙型と一緒に使用することはできないようですか? 私が試してみました:

typedef enum {

    MyEnumA = 0,
    MyEnumB,
    MyEnumC

} MyEnum;

NSNumber *n2 = @MyEnumA;  // [NSNumber numberWithInt:MyEnumA]

しかし、次のようなコンパイラ エラーが表示されます。

プログラムに予期しない '@' があります

列挙型は int であるため、なぜ機能しないのかわかりませんか? これを機能させる方法はありますか?

4

3 に答える 3

17

名前付き定数の場合は、 を使用する必要があります@(MyEnumA)

于 2012-11-08T13:27:41.960 に答える
3

以下を使用する必要があります。

NSNumber *n2 = @(MyEnumA);

私はそれが奇妙であることを知っていますが、それはまさにその通りです。頭のてっぺんから考えることはできませんが、パーサーは異なる構文を区別するために括弧が必要だと思います。

私がする傾向があるのは、常に括弧を使用することです。これは、通常の数値だけでなく、列挙型や次のような方程式でも機能します。

int a = 2;
int b = 5;
NSNumber *n = @(a*b);
于 2012-11-08T13:27:24.300 に答える
2

他の人は、適切な構文とは何かを説明しています。理由は次のとおりです。

@blah「リテラル」構文と呼ばれます。これを使用して、char、BOOL、int などのリテラルをラップするオブジェクトを作成します。つまり、次のことを意味します。

  • @42ボックス化されたintです
  • @'c'ボックス化された文字です
  • @"foo"ボックス化された文字です*
  • @42ull箱入りの無署名のロングロングです
  • @YESボックス化された BOOL です

アットマークに続くものはすべてプリミティブ値です。MyEnumValueはリテラルではありません。シンボルです。これに対応するために、一般的なボクシング構文が導入されました。

@(MyEnumValue)

かっこの中にたくさんのものを入れることができます。ほとんどの場合、あらゆる種類の変数または式が機能するはずです。

于 2012-11-08T15:00:04.250 に答える