【问题标题】:@"" string type literals for NSNumber@"" NSNumber 的字符串类型文字
【发布时间】:2011-04-14 15:48:45
【问题描述】:

我喜欢使用 @"string" 表示法在 Objective C 中对字符串文字的速记处理。有什么方法可以让NSNumbers 出现类似的行为?我更多地处理数字,到处都有[NSNumber numberWithWhatever:] 电话是如此乏味。即使创建一个宏也可以,但我对如何最好地做到这一点的知识有限。

【问题讨论】:

  • 正如 rjstelling 所指出的,这现在是 clang 中的一个功能。很是欣喜若狂。请投票结束,谢谢。
  • 没有必要关闭它。这是一个完全有效的问题。关闭是针对不受欢迎的问题,需要阻止答案。
  • 你应该接受@rjstelling 的回答,因为它现在更正确了。
  • 嗯,我想知道 SO 对此的看法是什么。蒂洛回答了当时的问题,所以在事实发生变化后将其授予另一个人似乎有点不公平。就像打折冯诺依曼一样,因为他没有预见到多核或其他东西。在三年内的 1542 次浏览中,这个问题甚至没有得到太多使用。此外,我认为 Tilo 的回答和 JeremyP 的改进对于那些可能正在寻找 NSSet 文字语法或 NSMutableArray 文字语法变通办法的人仍然有用,但它们不太可能出现在这里寻找目标。

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


【解决方案1】:

我正在使用类似的宏

#define N(x) [NSNumber numberWithInt: x]

导致代码类似

[N(123) intValue];

更新:

应该注意这种宏的 CPU 和内存消耗。虽然@"…" 字符串是static 编译器生成的常量字符串类的字符串(取决于基础,可能是Cocoa 中的NSConstantString?),宏创建的代码在运行时被评估,因此创建了一个新对象每次他们被调用。

【讨论】:

  • 略有改进:#define N(x) [NSDecimalNumber decimalNumberWithString: @"" #x]。将允许您执行N(1.4) 或N(1E09) 之类的操作
  • 是的,但速度不是很慢吗?我正在使用F(x) 宏来调用[NSNumber numberWithDouble: x]。
【解决方案2】:

从 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 编译器。

【讨论】:

  • 是的,非常令人兴奋!另外,我要在一百万人告诉我我是个白痴之前结束这个问题。
  • @rob5408 没有人会认为你是个白痴,这是一个有效的问题,而你在它问世前将近 2 年就问过这个问题。你会得到我的 +1。
  • NSInteger、float、double等类型的变量没有对应的快捷方式吗?
【解决方案3】:

Xcode 4.4 引入了 Clang 功能,rjstelling mentioned 用于 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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 嗨,亚当,好点子。即使在新语法出现之后,这对我来说也不是很明显。
    • 是否有相反的简写?一种从 NSNumber 中获取 intValue 的方法?
    • 正是我想要的!
    • 它有效,但对我来说有点“神秘”或明显。
    猜你喜欢
    • 2013-08-27
    • 1970-01-01
    • 2021-08-10
    • 2017-03-31
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多