如何处理'在初始化之前通过关闭捕获的自我'

时间:2017-05-09 09:54:39

标签: swift

说我的结构如下:

Language version

问题在于,我正在尝试使用self进行初始化回调,该回调尚未初始化。 如何避免循环引用和相应的错误?

2 个答案:

答案 0 :(得分:1)

最简单的方法就是:

class A {
    class ReadyHandler {
        let callback: () -> Void
        init(callback: @escaping () -> Void) { self.callback = callback }
    }

    let readyHandler: ReadyHandler
    var ready = false

    init() {
        var handlerBody = {}
        readyHandler = ReadyHandler { handlerBody() }
        handlerBody = { self.ready = true }
    }
}

答案 1 :(得分:1)

您的代码的问题是您已将变量声明为常量,并且swift应始终在init方法中初始化常量。但是,在这里你有依赖类型的要求,readyHandler属性是一个常量,必须初始化才能创建对象,但是,你在其中使用self并未初始化,你可以看到循环要求。

你可以直接摆脱这个,如果你使用可选或隐式解包的可选,在这种情况下,swift不需要在实例化阶段有初始值。

class A {
  class ReadyHandler { // fires off the callback when needed
    let callback: ()->Void
    init(callback: @escaping ()->Void) {
      self.callback = callback
    }
  }
  var readyHandler: ReadyHandler!
  var ready = false

  init() {
    readyHandler = ReadyHandler(callback: {self.ready = true})
  }
}

您可以为readyHandler创建一个也使用lazy属性,该属性在第一次使用时被初始化。

class A {
  class ReadyHandler {

    let callback: ()->Void

    init(callback: @escaping ()->Void) {
      self.callback = callback
    }

  }

  var ready = false

  lazy var readyHandler: ReadyHandler = {
    return ReadyHandler(callback: { [unowned self] in
      self.ready = true
    })
  }()
}