Swift在Ruby中是否具有“或等于”函数,如|| =?

时间:2016-02-26 19:18:58

标签: swift null-coalescing-operator

在Swift中,如何设置可选的foo,但前提是nil

我知道Swift's nil coalescing operator

foo = foo ?? "Hello"(其中foo是可选的String

但是,有没有更好的方法,比如Ruby?

foo ||= "Hello"

4 个答案:

答案 0 :(得分:7)

考虑并拒绝了这样的运营商:https://github.com/apple/swift-evolution/blob/master/proposals/0024-optional-value-setter.md

拒绝背后的理性应该在swift-evolution电子邮件列表中,但上面附带的链接指向SE-0025而不是24。

以下是理性的链接(由于Kenneth Bruno的评论打击而编辑):http://article.gmane.org/gmane.comp.lang.swift.evolution/7694

答案 1 :(得分:4)

不,这是做到这一点的方法。如果您愿意,可以将其包装在您自己的操作员中:

infix operator ||= {}
func ||=<T>(inout left: Optional<T>, right: T) { left = left ?? right }

var foo:String? = nil // foo -> nil
foo ||= "Hello"       // foo -> "Hello"
foo ||= "Hi"          // foo -> "Hello"

我建议使用??=来匹配模式foo = foo ?? "Hello",但要使用对你感觉舒服的任何内容。

答案 2 :(得分:2)

对于Swift 3中的Bool类型:

infix operator ||=
func ||=(lhs: inout Bool, rhs: Bool) { lhs = (lhs || rhs) }

用法:

var bool = false
bool ||= false // false
bool ||= true // true
bool ||= false // true

答案 3 :(得分:0)

对于Swift 5.1

infix operator ||=
func ||=<T>(lhs: inout Optional<T>, rhs: @autoclosure () -> T) { lhs = lhs ?? rhs() }

var foo:String? = nil // foo -> nil
foo ||= "Hello"       // foo -> "Hello"
foo ||= "Hi"          // foo -> "Hello"

请参见此处以了解@autoclosure之所以重要的原因:https://airspeedvelocity.net/2014/06/10/implementing-rubys-operator-in-swift/