编 号 | 比较项 | struct | class |
---|---|---|---|
1 | 类型 | 值类型 | 引用类型 |
2 | 属性初始化 | 可用默认构造直接初始化 | 需要自己创建构造方法,除非所属性都有默认值。 |
3 | 变量赋值 | 深拷贝 | 浅拷贝,增加原对象引用 |
4 | 类型方法 | 支持类型方法,但是不能继承自其它结构体或类 | 支持类型方法,并且可以作为基类被其它类继续 |
5 | 方法中修改属性 | 需要添加mutating关键字 | 不需要 |
6 | 继承关系 | 不能继承 | 可以继承 |
7 | 内存 | 通常在栈上,自动内存管理 | 在堆上,手动内存管理 |
8 | 执行速度 | 通常更高效 | 相对效率低 |
9 | 线程安全 | 值类型通常是线程安全的 | 引用类型大多是非线程安全的 |
10 | 与OC混编 | 不支持,OC无法调用struct | 支持,可以通过继承NSObject实现 |
11 | 序列化 | 不直接支持,但可以通过编码为字节后转换为NSData | 支持,可以通过NSCoding协议实现序列化 |
1.类型
struct是值类型,每次赋值或传递时都会创建一个新的副本; class是引用类型,赋值或传递的是对同一实例的引用。
2.属性初始化
struct有默认的成员逐一构造器,不需要手动编写; class则需要定义构造器,除非所有属性都有默认值。
3.变量赋值
struct在赋值时进行深拷贝;class在赋值时仅复制引用,引用计数加1,即浅拷贝。
4.类型方法
struct和class都支持类型方法,但是struct不能继承自其它结构体或类class 可以作为基类被其它类继续
5.方法中修改属性
struct的方法如果想要修改实例的属性,需要使用mutating关键字;
class的方法可以直接修改属性。
6.继承关系
struct不支持继承,不能从一个struct继承另一个struct或class;class可以继承另一个class的特性。
7.内存
struct通常存储在栈上,其内存由Swift的自动引用计数(ARC)管理;
class存储在堆上,也需要ARC来管理内存。
8.执行速度
struct因为通常存储在栈上并且是值类型,所以在处理时可能更快;class因为涉及到堆内存的管理和引用计数,可能相对较慢。
9.线程安全
由于struct是值类型,每个线程都有自己独立的副本,因此通常是线程安全的; class是引用类型,多个线程可能访问同一实例,因此需要额外的同步机制来保证线程安全。
10.与OC混编
Swift的struct不能被Objective-C直接调用,而class可以通过继承NSObject与Objective-C代码混编。
11.序列化
Swift的struct本身不支持序列化,但可以通过转换为字节流后存储;
class可以通过实现NSCoding协议支持序列化。