我正在寻找一些参考,除了苹果公司的快速编程参考,用于Set类型的存储空间以及由此产生的基本操作(并集,交集,排除,减法等)
鉴于以下伪代码:
var entities = Set<GKEntity>()
var subSetA = Set<GKEntity>()
var subSetB = Set<GKEntity>()
每个子集都有一个GKEntity的子类,它将在我将在我的应用程序中使用elswhere的一些例程中调用。
当我使用这些子集的并集时,IE:我将设置为所有子集的超集,或者所有子集的并集。
这是否意味着超集将是子集中元素的副本,或者它们只是指针?
我问这个内存空间使用情况,好像操作需要复制或分配新的内存地址一样,我需要使用不同的策略来存储我的元素。
从纯粹的结构角度来看,我认为这些将是“浅层”副本,这意味着它们将成为内存地址的指针,但是一旦我创建了超集作为所有子集的并集,我想要反映任何删除或添加在超集上,或者如果在超集上进行操作,则在特定子集上。
希望这个问题有效
答案 0 :(得分:0)
注意,我假设您的意思是this GKEntity
。
由于GKEntity
是一个类,因此您创建的集将存储对那些实际GKEntity
个对象的引用(指针)。因此,对子集中对象的任何更改都将反映在超集中。
这是一段代码,用于演示:
class A: IntegerLiteralConvertible, Hashable, CustomStringConvertible {
var x: Int
required init(integerLiteral value: Int) {
self.x = value
}
var hashValue: Int {
return x
}
var description: String {
return String(x)
}
}
func ==(lhs: A, rhs: A) -> Bool {
return lhs.hashValue == rhs.hashValue
}
let setA: Set<A> = [1, 2, 3, 4]
let setB: Set<A> = [5, 6, 7, 8]
print(setA) // [2, 3, 1, 4]
print(setB) // [5, 6, 7, 8]
let union = setA.union(setB)
print(union) // [2, 4, 5, 6, 7, 3, 1, 8]
setA.first!.x = 30
print(union) // [30, 4, 5, 6, 7, 3, 1, 8]
如您所见,我对x
中的第一项进行了更改(将setA
从2更改为30)。然后我打印出union
,其中包含30个。