我有这个类,其中属性是类本身。
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中自动完成的吗?
我没有看到将一组顶点作为指针数组保存的好方法,我当然不想保留实际值,因为我将拥有数千个体素。
答案 0 :(得分:2)
类(与结构体)的定义特征是它们是引用类型,并使用引用语义(即,对象的赋值仅复制对象的引用)。
类是引用类型
与值类型不同,引用类型在分配给变量或常量或传递给函数时不会被复制。而不是副本,而是使用对同一现有实例的引用。
另一方面,Structs是值类型,并且使用值语义(即,分配结构完全复制它)。
结构和枚举是值类型
值类型是一种类型,当将值分配给变量或常量时,或者将值传递给函数时,将复制该值。
我建议您阅读:The Swift Programming Language (Swift 2.2) - Classes and Structures
答案 1 :(得分:2)
因为Voxel
是class
,一个引用类型,所以这些是指针。如果它是struct
,则它将是值类型,因此每个新引用都是新副本。
顺便说一下,要警惕强大的参考周期。确保一个实例的隐式strong
引用below
不是另一个实例,其above
是另一个strong
引用,返回另一个实例。要解决此问题,您需要创建所有这些引用weak
,然后使用一些集合(例如,集合或可能是数组或字典)来维护对双向链表中所有实例的强引用。