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())
}
根据我的经验,函数通常比自定义运算符或重载更容易被其他人理解、阅读和调试。
在我的 属性 中,我在返回之前为 属性 赋值。下次访问它时,它正在检查它是否是 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())
}
根据我的经验,函数通常比自定义运算符或重载更容易被其他人理解、阅读和调试。