【发布时间】:2016-06-10 03:42:48
【问题描述】:
在 Swift 中,我如何设置可选的 foo,但前提是它是 nil?
我知道Swift's nil coalescing operator:
foo = foo ?? "Hello"(其中foo 是可选的String)
但是,有没有更好的方法,比如在 Ruby 中?
foo ||= "Hello"
【问题讨论】:
标签: swift null-coalescing-operator
在 Swift 中,我如何设置可选的 foo,但前提是它是 nil?
我知道Swift's nil coalescing operator:
foo = foo ?? "Hello"(其中foo 是可选的String)
但是,有没有更好的方法,比如在 Ruby 中?
foo ||= "Hello"
【问题讨论】:
标签: swift null-coalescing-operator
这样的算子被考虑拒绝了: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
【讨论】:
不,就是这样。如果你愿意,你可以把它包装在你自己的运营商中:
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" 模式,但请使用您觉得舒服的任何东西。
【讨论】:
对于 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/
【讨论】:
对于 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
【讨论】: