如果右侧不是零,是否有可能只执行一项任务(例如,对于非选择性财产)?我正在寻找一个单行表格:
if let unwrapped = funcThatReturnsOptional() {
object.nonOptionalProperty = unwrapped
}
Run Code Online (Sandbox Code Playgroud)
与您的代码具有相同效果的单个表达式是
funcThatReturnsOptional().map { object.nonOptionalProperty = $0 }
Run Code Online (Sandbox Code Playgroud)
但是您的代码绝对具有更好的可读性。
在此使用的map()方法,Optional并且仅当函数不返回时才执行闭包nil。
有多种方法,但并不太笨拙
使用 ??:
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)
好吧,实际上有一种方法可以通过引入新的运算符来实现这一点?=:
infix operator ?= : AssignmentPrecedence
func ?= <T: Any> (left: inout T, right: T?) {
if let right = right {
left = right
}
}
Run Code Online (Sandbox Code Playgroud)
通过使用?=上面的定义,如果可选值内部有值,您实际上可以将可选值分配给非可选值。