我有一个带有嵌套结构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'在被初始化之前使用
这是有道理的。我可以以某种方式解决这个错误吗?我想用weak
或unowned
解决这个问题(最好是后者,因为它应该是强保证非nil
参考),但我不喜欢我认为我完全理解逻辑,因为将MultipleChoiceAnswers
改为:
struct MultipleChoiceAnswers {
unowned let question:Question;
let answers:[Answer];
}
...无法解决错误。
如何在保持强保证非nil
循环引用的同时解决此错误?
PS:老实说,我甚至还不完全确定我是否真的需要这个循环引用开始,但是由于这个暂时的实现引发了这个错误,我很好奇关于可能的解决方案。
答案 0 :(得分:3)
只需在此处添加!
:
let answers:MultipleChoiceAnswers!
answers
在将self
传递给另一个函数之前需要有一个值。通过将answers
声明为隐式展开的可选项,您可以为其指定默认值nil
。这符合要求,然后离开。由于你在init
完成之前给它一个值,你永远不会有意外打开nil
的麻烦。 (但是你当然应该小心!
。)
这在Swift编程指南的"Unowned References and Implicitly Unwrapped Optional Properties"中讨论过。