许多语言中的一个共同特征是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)
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通过其Optional类型(Discriminated Union of sorts)支持null概念,该类型包含基础类型的值或没有值(由nil表示),并且必须明确定义为可选:
var a : String?
Run Code Online (Sandbox Code Playgroud)
非可选类型永远不能为零,或者指定为nil.因此,可以预期自定义中缀二进制NCO将可选作为其第一个参数.
在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)
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处理重载运算符的解决方式(没有文档,因此我不知道它是否可以解决).我已经改变了上面的功能来使用|||
.
归档时间: |
|
查看次数: |
10516 次 |
最近记录: |