Swift类中的属性是否自动引用?

时间:2016-05-26 20:14:16

标签: swift reference

我有这个类,其中属性是类本身。

class Voxel {
     var vertices : [Vertex] = []
     var above : Voxel?
     var below : Voxel?
     var front : Voxel?
     var back  : Voxel?
     var left  : Voxel?
     var right : Voxel?
}

它充当双3D链接列表中的节点,但事实是,在C和C ++中,我必须将邻居存储为指针(我也想对顶点数组执行此操作)。

这是在Swift中自动完成的吗?

我没有看到将一组顶点作为指针数组保存的好方法,我当然不想保留实际值,因为我将拥有数千个体素。

2 个答案:

答案 0 :(得分:2)

类(与结构体)的定义特征是它们是引用类型,并使用引用语义(即,对象的赋值仅复制对象的引用)。

  

类是引用类型

     

与值类型不同,引用类型在分配给变量或常量或传递给函数时不会被复制。而不是副本,而是使用对同一现有实例的引用。

另一方面,Structs是值类型,并且使用值语义(即,分配结构完全复制它)。

  

结构和枚举是值类型

     

值类型是一种类型,当将值分配给变量或常量时,或者将值传递给函数时,将复制该值。

我建议您阅读:The Swift Programming Language (Swift 2.2) - Classes and Structures

答案 1 :(得分:2)

因为Voxelclass,一个引用类型,所以这些是指针。如果它是struct,则它将是值类型,因此每个新引用都是新副本。

顺便说一下,要警惕强大的参考周期。确保一个实例的隐式strong引用below不是另一个实例,其above是另一个strong引用,返回另一个实例。要解决此问题,您需要创建所有这些引用weak,然后使用一些集合(例如,集合或可能是数组或字典)来维护对双向链表中所有实例的强引用。