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
希望对你有帮助
-
是的,现在它被迅速添加
-
小解释
var anumber:Int? = someValue var banumber = 2 anumber = ( anumber != nil) ? anumber : banumber ------- (a) println(anumber!)
现在,而不是写所有(一),我们可以使用这个 – >
anumber = anumber ?? banumber
和
操作员也可以在同一expression式中多次使用。 喜欢
firstNumber ?? secondNumber ?? thirdNumber.