Swift - 如何在具有 parent 和 child 关系的结构中避免循环引用?
Swift - How to avoid circular references in structs with parent and child relationships?
我有一段可以这样描述的关系;
One Parent
has many Child
(Children)
struct Parent {
var name: String
var cost: Int
var productionCost: Int
var income: Int
var children: [Child] = [Child]()
init(name: String) {
self.name = name
}
}
struct Child {
var name: String
var parent: Parent?
var owner: Player?
}
// not used but the intention is to so a player can own a child
class Player {
var name:
var cards: [Child] = [Child]()
}
parent需要知道它下面有什么child人,同样child需要知道它属于什么parent。
但在 Swift 游乐场中,我注意到存在潜在的循环引用。
如果我这样做;
var parent = Parent.init(name: "Parent #1")
var child = Child.init(name: "Child #1", parent: parent)
parent.children.append(child)
print (parent)
swift游乐场报道;
调试显示parents children,依次显示parent,等等...
我知道循环引用在继承上并不坏,但我想在这种描述的关系中尽量避免它们。
我只想要第一个parent。
关于 Whosebug 上的其他类似问题,我读到了:
"your child objects should be dumb data objects, they do not know anything about their parent and are self contained"
"the parent just holds child objects, it does not inject itself into them"
但我不确定这有什么帮助,因为我需要知道 parent 一个 child 属于什么。
我的问题是;
当我需要为两侧分配关系时,如何避免结构中的循环引用?
为此使用 类。您的结构正在创建父级的副本,而不是引用。
class Parent {
var name: String
var children: [Child] = [Child]()
init(name: String) {
self.name = name
}
}
class Child {
var name: String
weak var parent: Parent?
init(name:String,parent: Parent) {
self.name = name
self.parent = parent
}
}
我有一段可以这样描述的关系;
One
Parent
has manyChild
(Children)
struct Parent {
var name: String
var cost: Int
var productionCost: Int
var income: Int
var children: [Child] = [Child]()
init(name: String) {
self.name = name
}
}
struct Child {
var name: String
var parent: Parent?
var owner: Player?
}
// not used but the intention is to so a player can own a child
class Player {
var name:
var cards: [Child] = [Child]()
}
parent需要知道它下面有什么child人,同样child需要知道它属于什么parent。
但在 Swift 游乐场中,我注意到存在潜在的循环引用。
如果我这样做;
var parent = Parent.init(name: "Parent #1")
var child = Child.init(name: "Child #1", parent: parent)
parent.children.append(child)
print (parent)
swift游乐场报道;
调试显示parents children,依次显示parent,等等...
我知道循环引用在继承上并不坏,但我想在这种描述的关系中尽量避免它们。
我只想要第一个parent。
关于 Whosebug 上的其他类似问题,我读到了:
"your child objects should be dumb data objects, they do not know anything about their parent and are self contained"
"the parent just holds child objects, it does not inject itself into them"
但我不确定这有什么帮助,因为我需要知道 parent 一个 child 属于什么。
我的问题是;
当我需要为两侧分配关系时,如何避免结构中的循环引用?
为此使用 类。您的结构正在创建父级的副本,而不是引用。
class Parent {
var name: String
var children: [Child] = [Child]()
init(name: String) {
self.name = name
}
}
class Child {
var name: String
weak var parent: Parent?
init(name:String,parent: Parent) {
self.name = name
self.parent = parent
}
}