Swift

我们知道Swift中定义了一种新的运算符 ??,即空合运算符(Nil Coalescing Operator)
a ?? b就是对a进行空值判断,如果a不为nil,则返回a,否则返回b。Apple针对这个符号还设定了两个条件:

  • 表达式a必须是Optional类型
  • 表达式b必须和a的存储类型保持一致

值得注意的一点,这个运算符也是短路运算,如果a成立,表达式b则不会进行计算。
空合运算是a != nil ? a! : b的简写,的确简洁而优雅。
举个例子来说明这些特性,

var a:Int? = 10
var b = 20
var d = a ?? (++b)
print("b=\(b),d=\(d)") //b=20,d=10

a = nil
d = a ?? (++b)
print("b=\(b),d=\(d)") //b=21,d=21

Objective-C

那么来看看我们的老朋友OC,OC没有针对这种运算定义新的表达式。
但是,
直接看代码

    int a = 10;
    int b = 20;
    int d = a?:(++b);
    NSLog(@"b=%d,d=%d",b,d); // b=20,d=10

    a = nil;
    d = a?:(++b);
    NSLog(@"b=%d,d=%d",b,d); // b=21,d=21

可以看到三目运算这样的用法,达到了一模一样的效果,甚至连短路运算都是一致的。这个运算可以在Conditionals with Omitted Operands这里看到。
区别还是有的,就是这里的编译器并不会强制要求a和b是同一种类型,一般情况下这样的用法也是用于设置默认值,所以绝大部分情况下我们也期望a和b是同一种类型,所以这就是为什么在Swift中??运算符要求两个是同种类型吧。当然要注意,三目运算的这种用法在Swift中是不可用的。