如何在Swift中初始化双向图?

How to initialize bidirectional graph in Swift?

我有一些 类 用 "back pointers" 创建图表。我试图制作后向指针 unowned(否则它们会创建循环)并在我的 init() 中初始化它们,但这会导致 self 引用出现问题。我该如何解决这个问题?

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.child1child2 标记为隐式展开的可选值:

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

这不会导致错误,因为 child1child2 都有默认值 nil,然后您将在 init.[=22= 中更改它]

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保证已经完全初始化。

希望对您有所帮助。