我怎么能防止重复引用数组中的类对象?

时间:2017-06-13 03:56:09

标签: swift

我正在寻找一种方法来防止数组对其中的同一个对象进行重复引用。我不是指重复的值 - 那没关系。

例如,我知道在Apple的SpriteKit框架中,SKNode对象将其子节点存储在一个数组(var children: [SKNode])中,并且向父节点添加节点两次会导致程序崩溃。

let parent = SKNode()
let child1 = SKNode()
let child2 = SKNode()
parent.addChild(child1)
parent.addChild(child2)    // Allowed, although child2 == child1.
parent.addChild(child1)    // Causes a crash.

这是我想要模仿的确切行为。我该如何管理?是否可以在不必比较每个参考的情况下具有O(n)复杂度?

1 个答案:

答案 0 :(得分:1)

我不确定你为什么要这样做,但是你可以这样做:

...

var childReferences = Set<ObjectIdentifier>

private func validateUniqueness(_ node: SKNode) {
    guard childReferences.insert(ObjectIdentifier(node)).inserted else {
        fatalError("An attempt was made to add a duplicate child")
    }
}

override func addChild(_ node: SKNode) {
    validateUniqueness(node)
    super.addChild(node)
}

override func insertChild(_ node: SKNode at index: Int) {
    validateUniqueness(node)
    super.insertChild(node, at: index)
}

override func removeChildren(in nodes: [SKNode]) {
    childReferences.subtract(nodes)
    super.removeChildren(in nodes: [SKNode])
}

override func removeAllChildren() {
    childReferences.removeAll(keepingCapacity: false)
    super.removeAllChildren()
}