如何在Swift中初始化双向图?
我有一些类可以创建带有“反向指针”的图形。我试图使后指针如何在Swift中初始化双向图?,swift,initialization,Swift,Initialization,我有一些类可以创建带有“反向指针”的图形。我试图使后指针不为所有(否则它们会创建循环)并在我的init()中初始化它们,但这会给自身引用带来问题。我该怎么避开这件事呢 class Parent { var child1:Child var child2:Child unowned var myOwner:Thing init(myOwner:Thing) { child1 = Child(parent: self) // Compiler err
不为所有
(否则它们会创建循环)并在我的init()
中初始化它们,但这会给自身
引用带来问题。我该怎么避开这件事呢
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
出现该错误是因为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
保证已完全初始化
希望这能有所帮助。懒惰FTW。工作得很有魅力。