如果右侧不是零,是否有可能只执行一项任务(例如,对非选修属性)?我正在寻找单行表格:
if let unwrapped = funcThatReturnsOptional() {
object.nonOptionalProperty = unwrapped
}
答案 0 :(得分:5)
与您的代码具有相同效果的单个表达式
funcThatReturnsOptional().map { object.nonOptionalProperty = $0 }
但你的代码肯定更易读。
这里使用了map()
的{{1}}方法,闭包是
仅在函数未返回Optional
时执行。
答案 1 :(得分:3)
有各种不太笨重的方式
使用? :
object.nonOptionalProperty = funcThatReturnsOptional() ?? object.nonOptionalProperty
使用功能:
func setNotNil<T>(inout variable:T, _ value:T?)
{ if value != nil { variable = value! } }
setNotNil(&object.nonOptionalProperty, funcThatReturnsOptional())
使用运营商:
infix operator <-?? { associativity right precedence 90 assignment }
func <-??<T>(inout variable:T, value:T?)
{ if value != nil { variable = value! } }
object.nonOptionalProperty <-?? funcThatReturnsOptional()
使用扩展程序:
extension Equatable
{ mutating func setNotNil(value:Self?) { if value != nil { self = value! } } }
object.nonOptionalProperty.setNotNil(funcThatReturnsOptional())
答案 2 :(得分:2)
好的,实际上有一种方法可以通过引入一个新的运算符if($('.check:checked').length == $('.check').length) {
window.localStorage.clear();
location.reload();
return false;
}
来实现这一目标:
?=
通过使用上面定义的infix operator ?= { associativity right precedence 90 }
func ?= <T: Any> (inout left: T, right: T?) {
if let right = right {
left = right
}
}
,如果可选项内部有值,则实际上可以将可选项分配给非可选项。
答案 3 :(得分:0)
@ ch1llb4y和@ tyler-sheaffer提供的解决方案都不起作用,因为泛型会丢失有关可选值的信息。但这可以使用下面的unwrap
方法修复。
precedencegroup OptionalAssignment {
associativity: right
}
infix operator ?= : OptionalAssignment
public func ?= <T>(variable: inout T, value: T?) {
if let unwrapped = unwrap(any: value) ?? nil {
variable = unwrapped
}
}
public func unwrap<T: Any>(any: T) -> T? {
let mirror = Mirror(reflecting: any)
guard mirror.displayStyle == .optional else { return any }
guard let child = mirror.children.first else { return nil }
return unwrap(any: child.value) as? T
}
我还没有想出一个解决方案,不必在?? nil
中写unwrap(any: value) ?? nil
。
答案 4 :(得分:0)
可以通过使用if let
来避免反射,从而改善@Sajjon的答案。
precedencegroup OptionalAssignment { associativity: right }
infix operator ?= : OptionalAssignment
public func ?= <T>(variable: inout T, value: T?) {
if let value = value {
variable = value
}
}