Swift是否具有空合并运算符,如果不是,那么自定义运算符的示例是什么?

Ven*_*eri 43 swift

许多语言中的一个共同特征是Null Coalescing Operator,它是一个二进制运算符,通常用于缩短类型的表达式:

x = possiblyNullValue NCO valueIfNull
Run Code Online (Sandbox Code Playgroud)

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

Objective C的Null Coalescing运算符是?:,所以表达式为:

x = possiblyNullValue ?: valueIfNull
Run Code Online (Sandbox Code Playgroud)

上面的表达式也相当于使用第三运算符:

 x =  someTestForNotNull( possiblyNullValue ) ? possiblyNullValue : valueIfNull
Run Code Online (Sandbox Code Playgroud)

Null Coalescing Operator的优点

  • 更易读的代码(特别是长的描述性变量名称)
  • 减少印刷错误的可能性(测试的var仅键入一次)
  • 没有对测试变量进行双重评估,其中测试变量是一个getter,因为它访问过一次(或者需要将其缓存以有意避免双重评估).

Jia*_*aro 50

从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
Run Code Online (Sandbox Code Playgroud)

a ?? b 相当于以下代码:

a != nil ? a! : b
Run Code Online (Sandbox Code Playgroud)

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

x ?? y ?? 1 == 8
Run Code Online (Sandbox Code Playgroud)


Ven*_*eri 15

(另见博客文章)

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

为Swift定义自定义空结合运算符

可以为Swift定义自定义运算符,并考虑以下有关Swift语言的注意事项:

斯威夫特和尼尔

Swift通过其Optional类型(Discriminated Union of sorts)支持null概念,该类型包含基础类型的值或没有值(由nil表示),并且必须明确定义为可选:

var a : String?
Run Code Online (Sandbox Code Playgroud)

非可选类型永远不能为零,或者指定为nil.因此,可以预期自定义中缀二进制NCO将可选作为其第一个参数.

Swift中自定义操作符的可用字符

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

/ = - + * % < > ! & | ^ . ~
Run Code Online (Sandbox Code Playgroud)

运营商

鉴于可用字符的选择,||| (三个管道,没有间距)并不可怕(类似于Javascript中的双管道OR,它像NCO一样使用):

使用运算符

var a = String?
var z = a ||| "it's nil!"
println(z) //Output: it's nil!
Run Code Online (Sandbox Code Playgroud)

定义运算符

operator infix ||| {}

@infix func |||<T> (left: T?, right: T) -> T  {
  if let l = left { return l }
  return right
}
Run Code Online (Sandbox Code Playgroud)

  • 建议:在运算符声明中添加`associativity left`,以便输入:let x =`foo ||| 吧||| 巴兹||| "这是零"" (5认同)

Ana*_*ile 8

Venkat所说的是正确的:没有,但你可以定义一个.然而他的实施并不理想,因为他忘了使用@auto_closure.

另外我相信你可以||在不需要定义新运算符的情况下超载.

我这里没有编译器,但我会尝试从内存中提供代码:

func |||<T> (maybe: Optional<T>, defaultValue: @auto_closure () -> T) -> T {
    if let some = maybe { 
      return some 
    }
    return defaultValue()
}
Run Code Online (Sandbox Code Playgroud)

编辑:感谢Martin R用编译器测试它.查看评论.显然重载||是可能的,但可能无法正常工作,因为Swift处理重载运算符的解决方式(没有文档,因此我不知道它是否可以解决).我已经改变了上面的功能来使用|||.