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

时间:2017-05-18 03:56:58

标签: swift struct circular-reference

我有一种可以这样描述的关系;

  

一个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]()
}

父母需要知道它下面有什么孩子,同样孩子需要知道它所属的父母。

但在Swift游乐场,我注意到有一个潜在的循环参考。

如果我这样做;

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

parent.children.append(child)

print (parent)

快捷的游乐场报道;

Image

调试显示父母的孩子,他们反过来显示父母等...

我知道循环引用并不是遗传不好的,但我想尝试在这种描述的关系中避免使用它们。

我只想要第一个父母。

关于StackOverflow上的其他类似问题,我已经读过:

  • "您的子对象应该是愚蠢的数据对象,他们对父母一无所知并且是自包含的"

  • "父母只持有子对象,它不会将自身注入其中"

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

我的问题是;

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

1 个答案:

答案 0 :(得分:2)

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

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
    }
}