在我的属性中,我在返回属性之前为其赋值。下次访问它时,它正在检查它是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中有这样的东西吗?
答案 0 :(得分:1)
Swift确实有null合并操作符,所以你可以非常接近你的C#代码:
private var _myProp: MyInstance?
public var myProp: MyInstance {
mutating get {
_myProp = _myProp ?? MyInstance()
return _myProp!
}
}
Swift中的赋值运算符的计算结果为Void
,而不是指定的值,因此您无法将其用于return
语句。
答案 1 :(得分:1)
Swift中的类似符号将是:
private var _myProp: MyInstance?
public var myProp: MyInstance {
return _myProp ?? {_myProp = MyInstance(); return _myProp!}()
}
但是我不知道它看起来更像Swift或者更常见...
如果您经常使用这种模式,最好只创建一个全局函数来帮助,如下所示:
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())
}
根据我的经验,与自定义操作符或重载相比,其他人更容易理解,阅读和调试函数。
答案 2 :(得分:0)
根据你的回复,我认为这是“最快”的方式:
ID_CAP_LOCATION
它可能比你想要的更冗长,但作为交换,我认为它非常清楚,它并没有强制 - 解开任何选项。