如何在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. 将 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
.[=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
保证已经完全初始化。
希望对您有所帮助。
我有一些 类 用 "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. 将 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
.[=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
保证已经完全初始化。
希望对您有所帮助。