Swift 是否有像 Ruby 中的 ||= 这样的“或等于”函数?
Does Swift have an “or equals” function like ||= in Ruby?
在 Swift 中,如何设置可选的 foo
但前提是它是 nil
?
我知道 Swift's nil coalescing operator:
foo = foo ?? "Hello"
(其中 foo
是可选的 String
)
但是,有没有更好的方法,比如 Ruby?
foo ||= "Hello"
考虑并拒绝了这样的运算符:https://github.com/apple/swift-evolution/blob/master/proposals/0024-optional-value-setter.md
拒绝背后的理由应该在 swift-evolution 电子邮件列表中,但上面附加的 link 指向 SE-0025 而不是 24.
这是 link 的合理性(由于肯尼斯布鲁诺的评论打击而编辑):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"
,但请使用您觉得舒服的任何方式。
对于 Bool
类型 Swift 3:
infix operator ||=
func ||=(lhs: inout Bool, rhs: Bool) { lhs = (lhs || rhs) }
用法:
var bool = false
bool ||= false // false
bool ||= true // true
bool ||= false // true
对于Swift5.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 中,如何设置可选的 foo
但前提是它是 nil
?
我知道 Swift's nil coalescing operator:
foo = foo ?? "Hello"
(其中 foo
是可选的 String
)
但是,有没有更好的方法,比如 Ruby?
foo ||= "Hello"
考虑并拒绝了这样的运算符:https://github.com/apple/swift-evolution/blob/master/proposals/0024-optional-value-setter.md
拒绝背后的理由应该在 swift-evolution 电子邮件列表中,但上面附加的 link 指向 SE-0025 而不是 24.
这是 link 的合理性(由于肯尼斯布鲁诺的评论打击而编辑):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"
,但请使用您觉得舒服的任何方式。
对于 Bool
类型 Swift 3:
infix operator ||=
func ||=(lhs: inout Bool, rhs: Bool) { lhs = (lhs || rhs) }
用法:
var bool = false
bool ||= false // false
bool ||= true // true
bool ||= false // true
对于Swift5.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/