在没有超级的Swift类初始化程序中使用self

时间:2016-08-31 07:46:05

标签: swift

考虑这个课程

class A {

  private let model: Model

  init() {
    self.model = Model(service: self)
  }
}

您可以看到这会失败,因为我在初始化所有内容之前使用self。由于这是一个纯粹的快速类,因此无法调用super初始化程序。

如果没有NSObject超类,可能没有lazy,你会如何在纯swift中执行此操作?

1 个答案:

答案 0 :(得分:3)

从设计的角度来看,这基本上是错误的。您的班级A引用了ModelModel个引用A

逻辑上,这两个中的一个应该是可选变量(以便您可以将其设置为nil),或者是弱引用,否则您将拥有所有权圈和内存泄漏。

换句话说,这两个类中的一个应该是另一个的所有者,你不应该拥有共同的所有权。

让我们决定Model是拥有的类,然后:

class A {
   private let model: Model

   init() {
      let model = Model()
      self.model = model

      model.service = self
   }
}

另一种选择是使用隐式展开的可选

来使用2阶段初始化
class A {
   private var model: Model!

   init() {
      self.model = Model(service: self)
   }
}