Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift-如何避免在具有父子关系的结构中使用循环引用?_Swift_Struct_Circular Reference - Fatal编程技术网

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。而那个引用不是引用,而是一个新的副本。这就是他问题的全部要点。他说他很清楚这些东西是如何工作的。但是他问了一个问题,这个问题的答案必须与他最初想要的不同。所以最基本的答案是告诉他答案的参考部分。但我明白你的意思。如果你愿意,请随意编辑我的答案。