我正在寻找一种方法来防止数组对其中的同一个对象进行重复引用。我不是指重复的值 - 那没关系。
例如,我知道在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)复杂度?
答案 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()
}