考虑以下代码行的代码:
NSNumber *someNumber = (someOtherNumber) ? someOtherNumber : [NSNumber numberWithInt: 0];
基本上,它说如果someOtherNumber
不为null,请使用它,否则,使用0.我觉得应该有更好的方法来做到这一点。 SQL / SQLite有一个名为IFNULL
的便捷函数,可以使这更简单。如果它存在,它将使代码看起来像:
NSNumber *someNumber = IFNULL(someOtherNumber, [NSNumber numberWithInt: 0]);
在objective-c中是否存在类似的内容?
答案 0 :(得分:5)
Objective-C中有三元运算符的GNU扩展。
您可以使用
NSNumber *someNumber = (someOtherNumber) ?: [NSNumber numberWithInt: 0];
如果someOtherNumber
与[{1}}不同,则0
的值[NSNumber numberWithInt: 0]
如果someOtherNumber
等于0
,则会为其分配nil
的值(请注意{ {1}},NULL
和Nil
都是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。