Swift:设置<object>基本操作导致副本或指针?

时间:2016-08-17 05:58:56

标签: swift

我正在寻找一些参考,除了苹果公司的快速编程参考,用于Set类型的存储空间以及由此产生的基本操作(并集,交集,排除,减法等)

鉴于以下伪代码:

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

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

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

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

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

从纯粹的结构角度来看,我认为这些将是“浅层”副本,这意味着它们将成为内存地址的指针,但是一旦我创建了超集作为所有子集的并集,我想要反映任何删除或添加在超集上,或者如果在超集上进行操作,则在特定子集上。

希望这个问题有效

1 个答案:

答案 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个。