我正在寻找一种方法来防止数组中对同一对象的重复引用。我不是说重复的值——那很好。
例如,我知道在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)复杂度的情况下比较每个引用?
我不知道你到底为什么要这么做,但以下是你如何去做:
...
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()
}