提问者:小点点

如何防止对数组中类对象的重复引用?


我正在寻找一种方法来防止数组中对同一对象的重复引用。我不是说重复的值——那很好。

例如,我知道在Apple的SpriteKit框架中,SKNode对象将其子对象存储在一个数组中(var子对象:[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个答案

匿名用户

我不知道你到底为什么要这么做,但以下是你如何去做:

...

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