Objective-C是否与IFNULL相当?

时间:2013-04-09 19:39:18

标签: ios objective-c

考虑以下代码行的代码:

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

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

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

在objective-c中是否存在类似的内容?

5 个答案:

答案 0 :(得分:5)

Objective-C中有三元运算符的GNU扩展。

您可以使用

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

如果someOtherNumber与[{1}}不同,则0的值[NSNumber numberWithInt: 0]如果someOtherNumber等于0,则会为其分配nil的值(请注意{ {1}},NULLNil都是0}的形式。

为了获得额外的快乐,您可以将[NSNumber numberWithInt:0]表达式缩减为@0。此功能可从LLVM 3.3开始使用。

修改

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

答案 1 :(得分:5)

条件表达式收缩:

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

并使用现代的Obj-C,你可以进一步减少到:

NSNumber *someNumber = someOtherNumber ?: @0;

答案 2 :(得分:0)

#define IFNULL(compare, value) (compare) ?: (value)

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

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

答案 3 :(得分:0)

您可以这样定义:

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

答案 4 :(得分:0)

你可以稍微缩短一下语法:foo?:bar,如果foo是非零,将评估为foo,否则为bar。