如何初始化let闭包类型的属性来指向某些方法?

时间:2014-11-28 22:45:48

标签: swift initialization closures

查看以下代码

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
}

但这并不好。

我需要做的实际事情是更复杂,更有意义,这是本质。

2 个答案:

答案 0 :(得分:4)

您可以将该属性声明为隐式解包的可选:

let action: (String -> ())!

隐式展开的少数情况之一很有用且可以安全使用。

答案 1 :(得分:2)

使用lazy var

enter image description here

首次访问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) }
}