Swift-如何避免在具有父子关系的结构中使用循环引用?
我有一段可以这样描述的关系 一个Swift-如何避免在具有父子关系的结构中使用循环引用?,swift,struct,circular-reference,Swift,Struct,Circular Reference,我有一段可以这样描述的关系 一个父项有许多子项(子项) 家长需要知道其下有哪些孩子,同样,孩子也需要知道其所属的家长 但在斯威夫特游乐场,我注意到有一个潜在的循环参考 class Parent { var name: String var children: [Child] = [Child]() init(name: String) { self.name = name } } class Child { var name: Stri
父项
有许多子项
(子项)
家长需要知道其下有哪些孩子,同样,孩子也需要知道其所属的家长
但在斯威夫特游乐场,我注意到有一个潜在的循环参考
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
}
}
如果我这样做
var parent = Parent.init(name: "Parent #1")
var child = Child.init(name: "Child #1", parent: parent)
parent.children.append(child)
print (parent)
斯威夫特游乐场报道
调试将显示父级和子级,然后依次显示父级等
我知道循环引用并不是遗传性的不好,但我希望在这种关系中尽量避免它们
我只想要第一个父母
关于StackOverflow的其他类似问题,我读到:
- 您的子对象应该是哑数据对象,它们对其父对象一无所知,并且是自包含的
- 父对象只保存子对象,而不将自身注入子对象
当我需要将关系分配给两侧时,如何避免结构中的循环引用?为此使用类。您的结构正在创建父对象的副本,而不是引用
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
}
}
struct
类型是值类型。因此,您试图让子对象具有对父对象的引用是没有意义的,因为您实际上是在创建父对象的副本。这种双向链接只对引用类型有意义。你为什么要这样做?你知道这样你的结构会复制父结构吗?你想做的是用类,而不是结构。哦,好吧,我想用类来代替?但是对于哪一方,父母,孩子或两者?好吧,我的印象是结构会更好;但我理解复制的意义我正在做的项目是一个“游戏”,在一副牌中有一组牌。每张卡(子卡)都有一个对其所在卡组(父卡)的引用。但在我的提问中,我把所有与我的提问有关的纸牌和套牌的无关内容都抽象出来了。好的,我明白了,我现在接受你的回答。我想我在使用structs时太聪明了。答案现在被接受。如果你真的想使用这个“父对象有子对象数组,子对象有对父对象的引用”模型,我认为让init
(或任何相关方法)设置一个关系而不是另一个关系是危险的。这肯定会惹上麻烦。您要确保任何更改子对象的父对象的方法也会更改受影响父对象的子对象。如果你公开了影响一种关系而不是另一种关系的方法,你只是在乞求它们不同步。在这个例子中,我只是让他的代码在结构中保持1:1的比例,但是有几十种方法可以让它更好。我们向他解释说他不能使用structs。而那个引用不是引用,而是一个新的副本。这就是他问题的全部要点。他说他很清楚这些东西是如何工作的。但是他问了一个问题,这个问题的答案必须与他最初想要的不同。所以最基本的答案是告诉他答案的参考部分。但我明白你的意思。如果你愿意,请随意编辑我的答案。