在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()
答案 0 :(得分: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
)