2014-09-28 39 views
1

我有一个类Question嵌套结构MultipleChoiceAnswers。当初始化Question时,我也初始化了MultipleChoiceAnswers,并给它一个Question实例的参考。然后我想将MultipleChoiceAnswers实例分配给Question实例的属性answers如何解决此循环参考初始化错误?

这里是一个概述:

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

然而,这导致错误:

Variable 'self.answers' used before being initalized

这是有道理的。不管怎样,我能不能解决这个错误?我想用weakunowned解决这个的(最好是后者,因为它应该是一个 保证非nil参考),但我不认为我完全理解其中的逻辑,但因为改变MultipleChoiceAnswers到:

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

...不能解决错误。

如何解决此错误,同时保留 保证非nil循环参考?

P.S:说实话,我甚至完全肯定但我是否真的需要循环引用来开始的,但由于这试探性的实施提出了这个错误,我得到了好奇可能的解决方案呢。

回答

3

只需添加!这里:

let answers:MultipleChoiceAnswers! 

answers需要有之前通过self给另一个函数的值。通过声明answers为隐式解包可选项,您将其设置为默认值nil。这符合要求,不用走了。由于您在init完成前给它一个值,因此不会意外地解开nil。 (但当然,您应该始终小心!。)

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

+0

确实有效。谢谢。所以,(这个问题是由我为这个问题得到的)决定的,这是否意味着“弱”和/或“无主”与我的情况完全不相干?那些仅仅是用来防止内存泄漏,也许呢?无主的 – Codifier 2014-09-28 22:49:09

+0

在这里是一个不错的选择。我不知道你为什么被拒绝。 – 2014-09-29 01:05:58

+0

对。再次感谢。 – Codifier 2014-09-29 16:26:33

相关问题