【问题标题】:Is there an Objective-C equivalent to IFNULL? [duplicate]是否有相当于 IFNULL 的 Objective-C? [复制]
【发布时间】:2013-04-09 19:39:18
【问题描述】:

考虑以下代码行:

NSNumber *someNumber = (someOtherNumber) ? someOtherNumber : [NSNumber numberWithInt: 0];

基本上,它说如果someOtherNumber 不为null,则使用它,否则,使用0。我觉得应该有更好的方法来做到这一点。 SQL / SQLite 有一个方便的函数,叫做IFNULL,它可以让这变得更简单。如果它存在,它将使代码看起来像:

NSNumber *someNumber = IFNULL(someOtherNumber, [NSNumber numberWithInt: 0]);

objective-c 中是否存在类似的东西?

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    条件表达式有一个缩写:

    NSNumber *someNumber = someOtherNumber ?: [NSNumber numberWithInt: 0];
    

    使用现代 Obj-C,您可以将其进一步简化为:

    NSNumber *someNumber = someOtherNumber ?: @0;
    

    【讨论】:

    • 谢谢,这太棒了。绝对为我节省了大量的击键次数。
    【解决方案2】:

    Objective-C 中提供了对三元运算符的 GNU 扩展。

    你可以使用

    NSNumber *someNumber = (someOtherNumber) ?: [NSNumber numberWithInt: 0];
    

    如果someOtherNumber 等于0,则结果将被分配someOtherNumber 的值如果它不同于0[NSNumber numberWithInt: 0](注意nilNULLNil都是0的形式。

    为了获得额外的乐趣,您可以将[NSNumber numberWithInt:0] 表达式简化为@0。此功能可通过LLVM 3.3 使用。

    编辑

    更准确地说,现代版本的 LLVM 和 GCC 支持这一点,但它符合 ANSI C specification。 也就是说,您可以继续使用它,因为您很可能使用现代版本的 GCC 或 LLVM 编译它。

    【讨论】:

    • 值得注意的是,这在 C 中是非标准的,但由于 Objective-C 标准基本上是“Apple 的祝福编译器中的任何内容”,如果你是反正已经在使用 Objective-C。
    • 嘿,如果您使用 POC 编译 Objective-C,则 Stack Overflow 上的 Objective-C 标记中几乎没有任何内容适用于您。
    • 是的,注意它是一种修辞^^
    • @GabrielePetronella - 正如您提到的 ANSI C...您对 YESNO 的描述传达了正在发生的事情的想法,但这是 C...if statement and the conditional expression are defined precisely as selecting the first alternative if the predicate expression is not equal to 0` 如果是,则为第二个。而对于指针类型,“等于 0”被定义为“等于空指针常量”。这里没有YES,C 的乐趣;-)
    • 合法。大多数时候使用 Obj-C 的“专业偏见”。编辑我的帖子更正式。
    【解决方案3】:
    #define IFNULL(compare, value) (compare) ?: (value)
    

    应该做的伎俩,可以像在 mysql 中一样使用。

    NSNumber *foo = IFNULL(someNumber, @0);
    

    【讨论】:

      【解决方案4】:

      你可以这样定义:

      #define IFNULL(someOtherNumber) (someOtherNumber) ? someOtherNumber : [NSNumber numberWithInt:0];
      

      【讨论】:

        【解决方案5】:

        您可以稍微缩短语法:foo ?: bar,如果 foo 不为 nil,则评估为 foo,否则为 bar。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-07
          • 1970-01-01
          • 2013-07-07
          • 1970-01-01
          • 2021-09-27
          • 2019-10-18
          • 2012-03-27
          • 1970-01-01
          相关资源
          最近更新 更多