if x == nil {
x = y
}
我知道上面的陈述可以改写为:
x = x ?? y
但编译器不接受x ??= y
。是否有速记不重复x
?
答案 0 :(得分:8)
检查一下,将以下内容放在全局代码空间中(可能在Extensions.swift中)。这将创建一个可在整个项目中使用的自定义运算符。
Swift 2
infix operator ??= {}
func ??= <T>(inout left: T?, right: T) {
left = left ?? right
}
Swift 3
infix operator ??=
func ??= <T>(left: inout T?, right: T) {
left = left ?? right
}
用法:
var foo: String? = nil
var bar = "Bar"
foo ??= bar
print("Foo: \(bar)")
希望这会有所帮助:)
答案 1 :(得分:2)
此代码适用于游乐场:
var x: Int? = nil
let y = 5
x = x ?? y // x becomes 5
和
var x: Int? = 6
let y = 5
x = x ?? y // x stays 6
顺便提一下,这里有一些检查nil的变种:
if x != nil {
// classic
}
if x != .None {
// nil in Swift is enum with value .None
}
if let _x = x {
// if you need it's value
}
if let _ = x {
// if you don't need it's value
}
UPD:项目代码 - 复制并运行它:
var x: Int? = nil
let y = 5
x = x ?? y
print (x)
x = 7
x = x ?? y
print (x)
答案 2 :(得分:0)
Laffen’s的答案很好。但是,它并不完全等同于x = x ?? y
,因为总是使用其定义??=
来评估右侧,而不是使用标准??
运算符。
如果您也想这样做,@autoclosure
可以为您提供帮助:
infix operator ??=
func ??=<T>(left: inout T?, right: @autoclosure () -> T) {
left = left ?? right()
}