swift中类和结构体的区别

1. 类有而结构体没有的额外功能:

  • 继承允许一个类继承另一个类的特征;
  • 类型转换允许你在运行检查和解释一个类实例的类型;
  • 反初始化器允许一个类实例释放任何其所被分配的资源;
  • 引用计数允许不止一个对类实例的引用,而结构体在你的代码中通过复制来传递,并且并不会使用引用计数、

2. 结构体有而类没有的额外功能:

所有的结构体都有一个自动生成的初始化器,你可以使用它来初始化结构体实例的成员属性。新实例属性的初始化值可以通过属性名称传递到成员初始化器中:

    let vga = Resolution(width: 640, height: 480)

与结构体不同,类实例不会接收默认的成员初始化器,初始化器的更多细节在初始化章节。

3. 类型的不同

结构体和枚举是值类型(复制值,在新结构体以旧结构体的情况下,改变一个不影响对方);
而类是引用类型(引用同一个实例,在新类以旧类初始化的情况下,改变会影响对方)
为此,为了判别类是否引用同一实例,swift提供以下符号: 相同于 ( === ) 、 不同于(!==):

if newClass === oldClass {
    print("newClass and oldClass refer to the same instance.")
}

4. 类和结构体之间的选择

综上,结构体实例通过值来传递,而类实例通过引用来传递。

按照通用准则,当符合以下一条或多条情形时应考虑创建一个结构体:
  • 结构体的主要目的是为了封装一些相关的简单数据值;
  • 在赋予或者传递结构实例时,需要封装的数据值被拷贝而不是引用;
合适的结构体候选者包括:
  • 几何形状的大小,可能封装了一个 width属性和 height属性,两者都为 double类型;
  • 一定范围的路径,可能封装了一个 start属性和 length属性,两者为 Int类型;
  • 三维坐标系的一个点,可能封装了 x , y 和 z属性,他们都是 double类型。

在其他的情况下,定义一个类,并创建这个类的实例通过引用来管理和传递。事实上,大部分的自定义的数据结构应该是类,而不是结构体。

猜你喜欢

转载自blog.csdn.net/soviet1941/article/details/86479268