Swift - 如何避免具有父子关系的结构中的循环引用?

zar*_*don 2 struct circular-reference swift

我的关系可以这样描述;

一个Parent有很多Child(孩子)

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]()
}
Run Code Online (Sandbox Code Playgroud)

父级需要知道它下面有哪些子级,同样子级也需要知道它属于哪个父级。

但在 Swift 游乐场中,我注意到存在潜在的循环引用。

如果我做;

var parent = Parent.init(name: "Parent #1")
var child = Child.init(name: "Child #1", parent: parent)

parent.children.append(child)

print (parent)
Run Code Online (Sandbox Code Playgroud)

迅捷游乐场报道;

图像

调试显示父母孩子,这又显示父母,等等......

我知道循环引用并不是天生的坏事,但我想在这种描述的关系中尽量避免它们。

我只想要第一个父母。

关于 StackOverflow 上的其他类似问题,我读到:

  • “你的子对象应该是愚蠢的数据对象,它们对父对象一无所知并且是独立的”

  • “父对象只是持有子对象,它不会将自己注入到子对象中”

但我不确定这有什么帮助,因为我需要知道孩子属于哪个父母。

我的问题是;

当我需要向双方分配关系时,如何避免结构中的循环引用?

Neb*_*adj 5

为此使用类。您的结构正在创建父级的副本,而不是引用。

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
    }
}
Run Code Online (Sandbox Code Playgroud)