Shorthand 用于空合并运算符和可重新生成的赋值 属性?

Shorthand for null-coalescing operator and assignment for re-generatable property?

在我的 属性 中,我在返回之前为 属性 赋值。下次访问它时,它正在检查它是否是 nil 并再次分配它或只返回实例。

我现在就是这样做的:

private var _myProp: MyInstance?

public var myProp: MyInstance {
    if _myProp == nil {
        _myProp = MyInstance()
    }
    return _myProp!
}

这看起来很不像 Swift 并且希望有一种更优雅的方式来做到这一点。例如,在 C# 我可以这样做:

private var _myProp: MyInstance?

public var myProp: MyInstance {
    return _myProp ?? (_myProp = MyInstance())
}

我正在尝试允许 属性 重新生成,以便它可以被释放,但下次访问它时它将再次创建实例。

Swift 中有类似的内容吗?

根据您的回复,我认为这是 "swiftiest" 的方法:

private var _property: MyClass? = nil
public var property: MyClass {
    if let property = _property {
        return property
    } else {
        let property = MyClass()
        _property = property
        return property
    }
}

它可能比你想要的更冗长,但作为交换,我认为它非常清楚并且它不会强制解包任何可选值。

Swift 确实有空合并运算符,因此您可以像这样非常接近您的 C# 代码:

private var _myProp: MyInstance?

public var myProp: MyInstance {
    mutating get {
        _myProp = _myProp ?? MyInstance()
        return _myProp!
    }
}

Swift 中的赋值运算符的计算结果为 Void,而不是赋值,因此您不能仅将其用于 return 语句。

Swift 中的类似符号为:

private var _myProp: MyInstance?

public var myProp: MyInstance {
    return _myProp ?? {_myProp = MyInstance(); return _myProp!}()
}

但我不知道它真的更 Swift-like 或常见看到...

如果您经常使用此模式,最好只创建一个全局函数来提供帮助,如下所示:

func retrieve<T>(_ property:inout T?, withDefault value:T)->T {
    if property == nil {
        property = value
    }
    return property!
}

那么你的代码就变成了:

private var _myProp: MyInstance?

public var myProp: MyInstance {
    return retrieve(&_myProp, withDefault:MyInstance())
}

根据我的经验,函数通常比自定义运算符或重载更容易被其他人理解、阅读和调试。