查看以下代码
class Example {
let action: String -> ()
init() {
action = method //error: Variable self.action used before initialized
}
func method(s: String) {
println(s)
}
}
我将闭包类型的属性设置为类方法。要引用类方法,我需要初始化单个属性,但要正确地使用它,我需要引用该方法。我该如何摆脱这个循环?
我知道我可以做类似
的事情init() {
action = {_ in }
action = method //error: Variable self.action used before initialized
}
但这并不好。
我需要做的实际事情是更复杂,更有意义,这是本质。
答案 0 :(得分:4)
您可以将该属性声明为隐式解包的可选:
let action: (String -> ())!
隐式展开的少数情况之一很有用且可以安全使用。
答案 1 :(得分:2)
使用lazy var
:
首次访问action
时,将评估表达式self.method
(到那时self
有效)。
如果您对var action
可设置感到不舒服,可以使用(常见的Apple模式):
lazy private var _action : (String) -> () = self.method
var action { return _action } // only the 'getter' thus `var` is actually `let`
如果您对这两个人感到不舒服,可以使用private(set)
确保没有可见的setter。因此,
class Example {
lazy private(set) var action: (String -()) = self.method
func method (s:String) { println (s) }
}