@“”NSNumber的字符串类型文字

时间:2010-09-20 12:09:49

标签: objective-c macros nsnumber objective-c-literals

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

4 个答案:

答案 0 :(得分: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]

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

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

现在可以写成:

[Tyler setArms:@1];

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

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

答案 1 :(得分:29)

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

int val = 13;
NSNumber *numVal = @(val);

答案 2 :(得分:11)

我正在使用像

这样的宏
#define N(x) [NSNumber numberWithInt: x]

导致像

这样的代码
[N(123) intValue];

<强>更新

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

答案 3 :(得分:7)

Xcode 4.4为NSNumberNSArrayNSDictionary引入了文字rjstelling mentioned的Clang功能。语法很简单:

//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