20

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

4

4 回答 4

32

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

int val = 13;
NSNumber *numVal = @(val);
于 2013-07-08T20:01:33.657 回答
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 和内存消耗。虽然@"…"字符串是常量字符串类的静态编译器生成的字符串(取决于基础可能NSConstantString在 Cocoa 中?)宏创建在运行时评估的代码,因此每次调用它们时都会创建一个新对象。

于 2010-09-20T12:47:47.683 回答
7

Xcode 4.4 引入了rjstelling 提到的用于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
于 2012-07-25T17:56:20.847 回答