Ios 延迟加载可选属性,以后可能为零
在Objective-C中,使用lazy init,我可以将任何Ios 延迟加载可选属性,以后可能为零,ios,swift,Ios,Swift,在Objective-C中,使用lazy init,我可以将任何@property设置为nil,当我调用它的getter时,它将被重新创建 但是,在Swift中,使用lazy修饰符,它不起作用。 使用以下代码对其进行了测试: class SomeClass { lazy var optionalVar: String? = { return "abc" }() func checkVar() { println(optionalVar!)
@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()
当变量
设置为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()
除了中已经提出的解决方案外,我可以提出的最优雅的替代解决方案是在属性设置为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
)可能重复是的,我确实读过这个问题,还有其他一些相同主题的问题。基本上,这些问题的答案都是模仿objective-C解决方案。我正在寻找一个更优雅的解决方案。不幸的是,lazy只适用于一次性初始化。使用我的惰性
类(其代码在链接问题中)怎么样?这是一个很好的解决方案,真的。但是,我想先熟悉这门语言,所以我会用传统的方法。我想为每个var
创建许多方法。然后,我将调用var的“init方法”,而不是将它们设置为nil
,您认为呢?好吗?你能给我举个例子吗?