Swift是否有一个空合并运算符,如果不是,自定义运算符的例子是什么?

许多语言中的一个共同特征是空合并运算符 ( Null Coalescing Operator) ,它是一个经常用于缩短expression式types的二元运算符:

x = possiblyNullValue NCO valueIfNull 

NCO是语言的空合并运算符的占位符。

目标C的空合并运算符是?: ,所以expression式是:

 x = possiblyNullValue ?: valueIfNull 

上述expression式也等同于使用三级运算符:

  x = someTestForNotNull( possiblyNullValue ) ? possiblyNullValue : valueIfNull 

空合并运算符的优点

  • 更可读的代码(尤其是具有长描述性variables名称的代码)
  • 降低印刷错误的可能性(testingvariables只能input一次)
  • 因为它被访问一次(或需要caching它以故意避免双重评估),所以testingvariables是吸气剂的testingvariables没有双重评估。

从Swift 2.2( Xcode 6,beta 5 )开始呢??

 var x: Int? var y: Int? = 8 var z: Int = x ?? 9000 // z == 9000 z = y ?? 9001 // z == 8 

a ?? b a ?? b相当于下面的代码:

 a != nil ? a! : b 

而从Beta 6开始,你可以这样做:

 x ?? y ?? 1 == 8 

(另见博客文章 )

不,Swift目前不支持空合并运算符。

为Swift定义自定义Null合并运算符

可以为Swift定义一个自定义的操作符,以下是关于Swift语言的注意事项:

Swift和Nil

Swift通过它的Optionaltypes(一个Discriminated Uniontypes)支持一个null概念,它可以包含底层types的值或者没有值(由nil表示),并且必须被明确定义为可选的:

 var a : String? 

非可选types不能为零 ,也不能指定为零。 因此,一个自定义中缀二进制NCO可以作为第一个参数。

Swift中自定义运算符的可用字符

在Swift中,自定义运算符只能由以下字符组成:

 / = - + * % < > ! & | ^ . ~ 

运营商

鉴于可用字符的select,

(三个pipe道,没有间距)是不可怕的(类似于双pipe或在Javascript中使用像一个NCO):

使用操作员

 var a = String? var z = a 

"it's nil!" println(z) //Output: it's nil!

定义运营商

 operator infix 

{} @infix func

<T> (left: T?, right: T) -> T { if let l = left { return l } return right }

文卡特说的是正确的:没有,但你可以定义一个。 然而,他的实现并不理想,因为他忘了使用@auto_closure

另外我相信你可以重载|| 而不需要定义一个新的操作符。

我没有这里的编译器,但我会尝试从内存给你的代码:

 func 

<T> (maybe: Optional<T>, defaultValue: @auto_closure () -> T) -> T { if let some = maybe { return some } return defaultValue() }

编辑:感谢马丁R与编译器testing。 看到评论。 显然超载|| 是可能的,但可能无法正常工作,因为Swift处理重载操作符(这是无证的,因此我不知道它是否可以解决或不)的解决方法。 我已经改变了上面的函数来使用

我在博客上提供了一个自定义运算符函数,在这里提供了nil-coalescing: http : //ijoshsmith.com/2014/07/24/nil-coalescing-operator-in-swift/

我select的运营商是!! 它将逻辑非运算符(!)和解包运算符(!)合并为“如果不能解开”语义。 看来我迟到了,因为这个线程已经过了一个多月了。 无论哪种方式,这是我的实施情况,如果你有兴趣…

 operator infix !! {} @infix func !! <T> ( value: T?, defaultValue: @auto_closure () -> T) -> T { return value ? value! : defaultValue() } 

您可以在下面查看游乐场代码。

 import UIKit var personalSite : String? let defaultSite = "http://www.google.com" var website = personalSite ?? defaultSite 

希望对你有帮助

  1. 是的,现在它被迅速添加

  2. 小解释

      var anumber:Int? = someValue var banumber = 2 anumber = ( anumber != nil) ? anumber : banumber ------- (a) println(anumber!) 

现在,而不是写所有(一),我们可以使用这个 – >

  anumber = anumber ?? banumber 

操作员也可以在同一expression式中多次使用。 喜欢

  firstNumber ?? secondNumber ?? thirdNumber.