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

时间:2016-01-09 20:01:40

标签: swift

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

if let unwrapped = funcThatReturnsOptional() {
    object.nonOptionalProperty = unwrapped
}

5 个答案:

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