如何在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。工作得很有魅力。