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编译器.
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中依赖于基础?),但宏创建的代码在运行时进行评估,因此每次调用它们时都会创建一个新对象.
Xcode 4.4引入了为文字提到的rjstelling的Clang特性NSNumber,NSArray和NSDictionary.语法很简单:
//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)
| 归档时间: |
|
| 查看次数: |
6689 次 |
| 最近记录: |