@""NSNumber的字符串类型文字

rob*_*408 19 macros objective-c nsnumber objective-c-literals

我喜欢使用@"string"符号在Objective C中快速处理字符串文字.有没有办法让NSNumbers 获得类似的行为?我更多地处理数字,而且[NSNumber numberWithWhatever:]到处都有电话这么乏味.即使创建一个宏也可行,但我对如何最好地做到这一点的知识是有限的.

rjs*_*ing 30

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]
Run Code Online (Sandbox Code Playgroud)

所以,回答你的具体问题:

[Tyler setArms:[[[NSNumber alloc] initWithInt:1] autorelease]];
Run Code Online (Sandbox Code Playgroud)

现在可以写成:

[Tyler setArms:@1];
Run Code Online (Sandbox Code Playgroud)

数组和字典也有文字,但它们超出了这个问题的范围.

要利用Xcode中的文字,您至少需要4.4版 - 这是Apple的LLVM 4.0编译器.

  • 是的,非常令人兴奋!另外,在一百万人告诉我自己是个白痴之前,我要关闭这个问题. (2认同)
  • @ rob5408没有人会认为你是一个白痴,这是一个有效的问题,你问它差不多2年才可用.你从我那里得到+1. (2认同)

Ada*_*art 29

由于没有人提到过这个...如果你需要在NSNumber中包装一个值,NSNumber文字语法如下.

int val = 13;
NSNumber *numVal = @(val);
Run Code Online (Sandbox Code Playgroud)


Til*_*ütz 11

我正在使用宏

#define N(x) [NSNumber numberWithInt: x]
Run Code Online (Sandbox Code Playgroud)

这导致代码像

[N(123) intValue];
Run Code Online (Sandbox Code Playgroud)

更新:

应该知道这种宏的CPU和内存消耗.虽然@"…"字符串是静态编译器生成的常量字符串类的字符串(可能NSConstantString在Cocoa中依赖于基础?),但宏创建的代码在运行时进行评估,因此每次调用它们时都会创建一个新对象.

  • 稍微改进:`#define N(x)[NSDecimalNumber decimalNumberWithString:@""#x]`.允许你做"N(1.4)"或"N(1E09)"之类的事情 (3认同)

Joe*_*Joe 7

Xcode 4.4引入了为文字提到rjstelling的Clang特性NSNumber,NSArrayNSDictionary.语法很简单:

//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
Run Code Online (Sandbox Code Playgroud)