2014-09-28 3 views
1

클래스 Question과 내포 된 구조체 MultipleChoiceAnswers이 있습니다. Question을 초기화 할 때 MultipleChoiceAnswers도 초기화하고 Question 인스턴스에 대한 참조를 제공합니다. 그런 다음 MultipleChoiceAnswers 인스턴스를 인스턴스의 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

이 의미가 있습니다. 이 오류는 어떻게 든 해결할 수 있습니까? 에 MultipleChoiceAnswers을 변경하기 때문에, (그것이 강력한 보장 비 nil 참조해야하기 때문에, 바람직하게는 후자) 나는 weak 또는 unowned 이것을 해결의 생각,하지만 난 아직 완전히 논리를 이해 생각하지 않는다 :

... 오류가 해결되지 않습니다.

의 비보호를 유지하면서이 오류를 해결하려면 어떻게해야합니까? nil 순환 참조가 보장 되나요?

P.S는 : 나는 실제로 로 시작하는이 순환 참조를해야하는지 여부를 아직조차 완전히 확실하지 않다, 정직하게,하지만이 임시 구현이 오류가 발생하기 때문에, 어쨌든 가능한 해결 방법에 대한 호기심이 있어요.

답변

3

그냥 여기 !을 추가

let answers:MultipleChoiceAnswers! 

answers 요구를 다른 함수에 self를 통과하기 전에 값을 가질 수 있습니다. answers을 암시 적 언 래핑 옵션으로 선언하면 기본값 인 nil이 부여됩니다. 그건 요구 사항을 충족하고, 당신은 가버립니다. init 완료 전에 값을 주면 실수로 nil의 래핑을 해제하는 데 문제가 없습니다. (물론 !으로 항상 조심해야합니다.)

이것은 Swift Programming Guide의 "Unowned References and Implicitly Unwrapped Optional Properties"에서 논의됩니다.

+0

실제로 작동합니다. 고맙습니다. 그래서, (나는이 질문에 대한 하향 투표를했다) 이것은 "약한"및/또는 "소유하지 않은"것이 나의 경우와 완전히 무관하다는 것을 의미 하는가? 그것들은 단순히 메모리 누수를 막는 데 사용되는 것일까? 아마도? – Codifier

+0

unowned는 좋은 선택이었습니다. 왜 당신이 다운 보위에 있었는지 전혀 모르겠습니다. –

+0

오른쪽 위에 있습니다. 다시 한번 감사드립니다. – Codifier

관련 문제