欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

swift中类和结构体的区别

程序员文章站 2022-03-10 22:50:03
...

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类型。

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

相关标签: swift 基础