1

考虑以下代码行的代码:

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

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

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

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

4

5 回答 5

5

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

您可以使用

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

结果将被赋值为someOtherNumberif 它不同于0[NSNumber numberWithInt: 0]ifsomeOtherNumber等于0(注意nil,NULLNil都是 的形式0)。

为了额外的快乐,你可以减少你的[NSNumber numberWithInt:0]表情@0从LLVM 3.3开始就可以使用此功能。

编辑

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

于 2013-04-09T19:40:57.830 回答
5

条件表达式有一个收缩:

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

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

NSNumber *someNumber = someOtherNumber ?: @0;
于 2013-04-09T19:42:09.703 回答
0
#define IFNULL(compare, value) (compare) ?: (value)

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

NSNumber *foo = IFNULL(someNumber, @0);
于 2013-04-09T19:41:44.007 回答
0

你可以这样定义:

#define IFNULL(someOtherNumber) (someOtherNumber) ? someOtherNumber : [NSNumber numberWithInt:0];
于 2013-04-09T19:41:53.793 回答
0

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

于 2013-04-09T19:42:04.750 回答