类和结构体都是人们构建代码的一种通用灵活的构造体。
Swift中类和结构体有很多共同特点:
- 定义属性用于存储值
- 定义方法用于提供功能
- 定义附属脚本用于访问值
- 定义构造器用于生成初始化值
- 通过扩展以增加默认实现的功能
- 符合协议以对某类提供标准功能
与结构体相比,类还有如下的附加功能:
- 继承允许一个类继承另一个类的特征
- 类型转换允许在运行时检查和解释一个类实例的类型
- 解构器允许一个类实例释放任何其所被分配的资源
- 引用计数允许对一个类的多次引用
类和结构体的定义与使用方式都类似:
1 2 3 4 5 6 7
| class Human { // 定义类的属性及方法 }
struct Human { // 定义结构的属性及方法 }
|
类与结构体的实例生成及属性访问,方法操作都一样:
不同的是,结构体都有一个自动生成的逐一构造器,用于初始化新结构体实例中成员的属性。
结构体是值类型,在进行函数传递时,操作的是其拷贝。而类则是引用类型的,引用的是已存在的实例本身,而不是其拷贝。
如何选择?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 在你的代码中,你可以使用类和结构体来定义你的自定义数据类型。
然而,结构体实例总是通过值传递,类实例总是通过引用传递。这意味两者适用不同的任务。当你在考虑一个工程项目的数据构造和功能的时候,你需要决定每个数据构造是定义成类还是结构体。
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
- 结构体的主要目的是用来封装少量相关简单数据值。 - 有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用。 - 任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用。 - 结构体不需要去继承另一个已存在类型的属性或者行为。
合适的结构体候选者包括:
- 几何形状的大小,封装一个width属性和height属性,两者均为Double类型。 - 一定范围内的路径,封装一个start属性和length属性,两者均为Int类型。 - 三维坐标系内一点,封装x,y和z属性,三者均为Double类型。
在所有其它案例中,定义一个类,生成一个它的实例,并通过引用来管理和传递。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。
|