如果在Swift中为nil,那么赋值的速记?

时间:2015-12-03 07:14:37

标签: swift

if x == nil {
    x = y
}

我知道上面的陈述可以改写为:

x = x ?? y

但编译器不接受x ??= y。是否有速记不重复x

3 个答案:

答案 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()
}