如何解决此循环引用初始化错误?

时间:2014-09-28 21:46:28

标签: swift initialization circular-reference

我有一个带有嵌套结构Question的类MultipleChoiceAnswers。初始化Question时,我也会初始化MultipleChoiceAnswers,并为其提供Question实例的引用。然后,我想将MultipleChoiceAnswers实例分配给answers实例的属性Question

以下是概述:

struct Answer {
  let value:Double;
  let isCorrect:Bool;
}

class Question {
  struct MultipleChoiceAnswers {
    let question:Question;
    let answers:[Answer];
  }

  let answers:MultipleChoiceAnswers;

  init( possibleAnswersCount:UInt ) {
    let answers:[Answer];
    /*
      here I generate some Answer instances
      that get appended to the answers Array
    */
    self.answers = MultipleChoiceAnswers( question: self, answers: answers ); // <-- error
  }
}

但是,这会导致错误:

  

变量'self.answers'在被初始化之前使用

这是有道理的。我可以以某种方式解决这个错误吗?我想用weakunowned解决这个问题(最好是后者,因为它应该是保证非nil参考),但我不喜欢我认为我完全理解逻辑,因为将MultipleChoiceAnswers改为:

struct MultipleChoiceAnswers {
  unowned let question:Question;
  let answers:[Answer];
}

...无法解决错误。

如何在保持保证非nil循环引用的同时解决此错误?

PS:老实说,我甚至还不完全确定我是否真的需要这个循环引用开始,但是由于这个暂时的实现引发了这个错误,我很好奇关于可能的解决方案。

1 个答案:

答案 0 :(得分:3)

只需在此处添加!

let answers:MultipleChoiceAnswers!

answers在将self传递给另一个函数之前需要有一个值。通过将answers声明为隐式展开的可选项,您可以为其指定默认值nil。这符合要求,然后离开。由于你在init完成之前给它一个值,你永远不会有意外打开nil的麻烦。 (但是你当然应该小心!。)

这在Swift编程指南的"Unowned References and Implicitly Unwrapped Optional Properties"中讨论过。