Objective c 新的NSNumber文本

Objective c 新的NSNumber文本,objective-c,cocoa,xcode4.5,nsnumber,Objective C,Cocoa,Xcode4.5,Nsnumber,由于Objective-C中有新的NSNumber文本可供使用,例如: NSNumber *n1 = @1000; // [NSNumber numberWithInt:1000] 但它似乎不可能与枚举一起使用?我试过: typedef enum { MyEnumA = 0, MyEnumB, MyEnumC } MyEnum; NSNumber *n2 = @MyEnumA; // [NSNumber numberWithInt:MyEnumA] 但是我得

由于Objective-C中有新的
NSNumber
文本可供使用,例如:

NSNumber *n1 = @1000;  // [NSNumber numberWithInt:1000]
但它似乎不可能与枚举一起使用?我试过:

typedef enum {

    MyEnumA = 0,
    MyEnumB,
    MyEnumC

} MyEnum;

NSNumber *n2 = @MyEnumA;  // [NSNumber numberWithInt:MyEnumA]
但是我得到一个编译器错误,它说:

程序中出现意外的“@”

我不明白为什么它不工作,因为枚举是int? 有什么方法可以使这项工作正常进行吗?

您需要使用:

NSNumber *n2 = @(MyEnumA);
我知道这很奇怪,但就是这样。我想不起来,但我假设解析器需要括号来区分不同的语法

我倾向于总是使用括号。这适用于正常数字、枚举以及以下等式:

int a = 2;
int b = 5;
NSNumber *n = @(a*b);

对于命名常量,您需要使用
@(MyEnumA)

其他人已经解释了正确的语法。原因如下:

@blah
被称为“文字”语法。您可以使用它来创建包装文字的对象,如char、BOOL、int等。这意味着:

  • @42
    是一个带方框的int
  • @'c'
    是一个装箱字符
  • @“foo”
    是一个装箱字符*
  • @42ull
    是一个装箱的无符号长字符串
  • @YES
    是一个盒装文件
at符号后面的所有东西都是原始值
MyEnumValue
不是文本。这是一个象征。为了适应这种情况,引入了通用装箱语法:

@(MyEnumValue)

你可以在括号里放一些东西;在大多数情况下,任何类型的变量或表达式都应该起作用

原因是苹果可能希望稍后添加一个名为
@MyEnumA
的关键字,并且不想破坏您的代码。@GrahamLee名称冲突不限于将来添加到语言中。考虑一个名为“代码>接口或<代码>结束<代码>的枚举。