Objective-C是否与IFNULL相当?

考虑以下代码行的代码:

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

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

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

在objective-c中是否存在这样的东西?

条件表达式收缩:

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

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

 NSNumber *someNumber = someOtherNumber ?: @0; 

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

您可以使用

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

如果someOtherNumber不等于0 ,则为结果分配someOtherNumber的值;如果someOtherNumber等于0则为其分配[NSNumber numberWithInt: 0] (注意nilNULLNil都是0forms)。

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

编辑

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

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

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

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

您可以这样定义:

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

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