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]
(注意nil
, NULL
和Nil
都是0
forms)。
为了获得额外的快乐,您可以将[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。