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