Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何处理';初始化前由闭包自动捕获';_Swift - Fatal编程技术网

Swift 如何处理';初始化前由闭包自动捕获';

Swift 如何处理';初始化前由闭包自动捕获';,swift,Swift,假设我有一个如下的结构: class A { class ReadyHandler { // fires off the callback when needed let callback; init(callback: ()->Void) { self.callback = callback } } let readyHandler: ReadyHandler let ready = false init() { ready

假设我有一个如下的结构:

class A {
  class ReadyHandler { // fires off the callback when needed
    let callback;
    init(callback: ()->Void) {
      self.callback = callback
    }
  }
  let readyHandler: ReadyHandler
  let ready = false
  init() {
    readyHandler = ReadyHandler(callback: {self.ready = true})
  }
}
问题是,很自然地,我正在尝试使用self初始化回调,而self尚未初始化。
如何避免循环引用和相应的错误?

最简单的方法是:

A类{
类ReadyHandler{
让回调:()->Void
init(回调:@escaping()->Void){self.callback=callback}
}
让readyHandler:readyHandler
var ready=false
init(){
var handlerBody={}
readyHandler=readyHandler{handlerBody()}
handlerBody={self.ready=true}
}
}

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

如果使用optional或隐式unwrapped optional(在这种情况下,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创建一个还使用惰性属性,该属性在第一次使用时被初始化

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
    })
  }()
}

您可以使用另一种方法进行处理程序初始化,并通过factory类创建实例