gpt4 book ai didi

Swift:Set 基本操作会导致副本或指针?
转载 作者:行者123 更新时间:2023-11-28 08:30:19 24 4
gpt4 key购买 nike

我目前正在寻找一些引用,除了 apple 的关于 Set 类型的内存空间和由此产生的基本操作(并集、交集、排除、减法等)的快速编程引用之外

给定以下伪代码:

var entities = Set<GKEntity>()
var subSetA = Set<GKEntity>()
var subSetB = Set<GKEntity>()

每个子集都有一个 GKEntity 的子类,我将在我的应用程序的其他地方使用一些例程调用它。

当我使用这些子集的并集时,IE:我将设置为所有子集的超集,或者所有子集的并集。

这是否意味着超集将是子集中元素的副本,或者它们只是指针?

我询问内存空间使用情况,好像该操作需要复制或分配新的内存地址,我将需要使用不同的策略来存储我的元素。

从纯粹的结构角度来看,我假设这些将是“浅”副本,这意味着它们将是指向内存地址的指针,但是一旦我将超集创建为所有子集的并集,我希望反射(reflect)任何删除或添加在超集上,或者如果操作是在超集上进行的,则在特定子集上向下。

希望这个问题是有效的

最佳答案

请注意,我假设您的意思是 this GKEntity.

由于 GKEntity 是一个类,您创建的集合将存储对那些实际 GKEntity 对象的引用(指针)。因此,对子集中对象的任何更改都将反射(reflect)在超集中。

这里有一小段代码可以演示这一点:

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]

如您所见,我对 setA 中的第一项进行了更改(将 x 从 2 更改为 30)。然后我打印出 union,其中确实包含一个 30。

关于Swift:Set<Object> 基本操作会导致副本或指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38989062/

24 4 0