延迟加载可能稍后为零的可选属性
Posted
技术标签:
【中文标题】延迟加载可能稍后为零的可选属性【英文标题】:Lazy loading optional property that maybe nil later 【发布时间】:2014-11-27 10:12:02 【问题描述】:在 Objective-C 中,通过惰性初始化,我可以将任何 @property
设置为 nil
,当我调用它的 getter
时,它将被重新创建。
但是,在 Swift 中,使用 lazy
修饰符,它不起作用。
使用此代码对其进行了测试:
class SomeClass
lazy var optionalVar: String? =
return "abc"
()
func checkVar()
println(optionalVar!)
let instance = SomeClass()
instance.checkVar()
//instance.variable = nil
instance.checkVar()
当variable
设置为nil
时,不会重新初始化。因此,下一行代码触发运行时错误。
如何让我的 Swift 代码像在 Objective-C 中一样工作? 谢谢。
---------------- 编辑:添加更多代码
class SomeClass
var optionalVar: String?
func checkVar()
println(optionalVar!)
func createVar() -> String
if let tempVar = optionalVar
return tempVar
else
println("create optional")
return "123"
let instance = SomeClass()
instance.optionalVar = instance.createVar()
instance.checkVar()
instance.optionalVar = nil
instance.optionalVar = instance.createVar()
instance.checkVar()
【问题讨论】:
Trigger lazy initializer again in Swift by setting property to nil的可能重复 是的,我确实读过这个问题,以及其他几个相同主题的问题。基本上,这些问题的答案都是模仿 Objective-C 解决方案。我正在寻找更优雅的解决方案。 不幸的是,懒惰是为了一次性初始化。使用我的代码在链接问题中的Lazy
类怎么样?
这是一个很好的解决方案,真的。但是,我想先熟悉语言,所以我会使用传统的方式。我正在考虑为每个var
创建许多methods
。然后,我不会将它们设置为nil
,而是调用 var 的“init 方法”,你怎么看?这样好吗?
你能举个例子吗?
【参考方案1】:
除了this answer 中已经提出的建议之外,我可以提出的最优雅的替代解决方案是在属性设置为 nil 时进行拦截,并使用默认值覆盖分配:
class SomeClass
private var _optionalVar: String?
var nonoptionalVar: String?
get return _optionalVar
set _optionalVar = newValue == nil ? "123" : newValue
init()
self.nonoptionalVar = nil
但有一个缺点:您必须记住在初始化程序中将属性显式设置为 nil(否则该属性将保留其默认初始值,即 nil
)
【讨论】:
以上是关于延迟加载可能稍后为零的可选属性的主要内容,如果未能解决你的问题,请参考以下文章