2015-04-29 1 views
1

У меня есть несколько классов, которые создают график с «обратными указателями». Я попытался сделать обратные указатели unowned (они будут создавать циклы в противном случае) и инициализировать их в моем init(), но это создает проблемы с ссылками self. Как я могу обойти это?Как инициализировать двунаправленный граф в Swift?

class Parent { 
    var child1:Child 
    var child2:Child 
    unowned var myOwner:Thing 

    init(myOwner:Thing) { 
     child1 = Child(parent: self) // Compiler errors here 
     child2 = Child(parent: self) // and here 
     self.myOwner = myOwner 
    } 
} 

class Child { 
    unowned var parent:Parent 

    init(parent:Parent) { 
     self.parent = parent 
    } 
} 

Ошибки я получаю

'self' used before all all stored properties are initialized 

ответ

1

Вы эту ошибку, потому что Swift навязывает, что все переменные должны иметь значение, прежде чем вы можете использовать, чтобы избежать self экземпляра не полностью инициализирован. В вашем случае у вас есть два варианта:

1. Марк child1 и child2, как неявно развернутые ДОПОЛНИТЕЛЬНО:

class Parent { 
    var child1: Child! 
    var child2: Child! 
    unowned var myOwner:Thing 

    init(myOwner:Thing) { 
     // Note - myOwner is being set before the children. 
     self.myOwner = myOwner 

     child1 = Child(parent: self) 
     child2 = Child(parent: self) 
    } 
} 

Это приводит без ошибок, потому что оба child1 и child2 имеют значение по умолчанию nil, который вы затем меняетесь в init.

2. Использование lazy конкретизации:

class Parent { 
    lazy var child1: Child = Child(parent: self) 
    lazy var child2: Child = Child(parent: self) 
    unowned var myOwner:Thing 

    init(myOwner:Thing) { 
     self.myOwner = myOwner 
    } 
} 

Это приводит без ошибок, потому что значение а lazy В отеле вычисляется только при первом использовании, поэтому self гарантированно был полностью инициализирован.

Надеюсь, что это поможет.

+0

ленивый FTW. Работал как шарм. –

Смежные вопросы