仅在右侧不为零时执行分配

Ch1*_*b4y 12 swift

如果右侧不是零,是否有可能只执行一项任务(例如,对于非选择性财产)?我正在寻找一个单行表格:

if let unwrapped = funcThatReturnsOptional() {
    object.nonOptionalProperty = unwrapped
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 5

与您的代码具有相同效果的单个表达式是

funcThatReturnsOptional().map { object.nonOptionalProperty = $0 }
Run Code Online (Sandbox Code Playgroud)

但是您的代码绝对具有更好的可读性。

在此使用的map()方法,Optional并且仅当函数不返回时才执行闭包nil

  • @ Ch1llb4y:我不知道这样的解决方案。您可以定义一个自定义赋值运算符。问题是即使您没有在运算符函数中分配新值,inout参数也会触发属性设置器。 (3认同)

Ala*_* T. 5

有多种方法,但并不太笨拙

使用 ??:

object.nonOptionalProperty = funcThatReturnsOptional() ?? object.nonOptionalProperty 
Run Code Online (Sandbox Code Playgroud)

使用函数:

func setNotNil<T>(inout variable:T, _ value:T?)
{ if value != nil { variable = value! } }

setNotNil(&object.nonOptionalProperty, funcThatReturnsOptional())
Run Code Online (Sandbox Code Playgroud)

使用运算符:

infix operator <-?? { associativity right precedence 90 assignment }
func <-??<T>(inout variable:T, value:T?)
{ if value != nil { variable = value! } }

object.nonOptionalProperty <-?? funcThatReturnsOptional() 
Run Code Online (Sandbox Code Playgroud)

使用扩展:

extension Equatable
{ mutating func setNotNil(value:Self?) { if value != nil { self = value! } } }

object.nonOptionalProperty.setNotNil(funcThatReturnsOptional())
Run Code Online (Sandbox Code Playgroud)


Ch1*_*b4y 4

好吧,实际上有一种方法可以通过引入新的运算符来实现这一点?=

infix operator ?= : AssignmentPrecedence
func ?= <T: Any> (left: inout T, right: T?) {
    if let right = right {
        left = right
    }
}
Run Code Online (Sandbox Code Playgroud)

通过使用?=上面的定义,如果可选值内部有值,您实际上可以将可选值分配给非可选值。

  • 是的,但请注意,将变量作为 `myVar ?= nil` 中的 inout 表达式传递给运算符将调用属性观察者 willSet/didSet,并且在计算属性的情况下都会调用 get/set,即使您不这样做在运算符内分配一个新值。 (2认同)