本质区别:struct 是值引用(value reference),而 class 是地址引用(class reference)。后面很多差异都是因此导致的。
构造方法
struct 会自动将成员变量自动添加到构造方法中,自动生成带参构造器。
- 注1:自动生成的带参构造器会将全部参数加入。
- 注2:如果当中有一个私有属性,那么就不会自动生成带参构造器。
class 不会自动生成带参构造器
等号赋值
struct是值引用类型,那么在使用等号赋值的时候,会将值复制一份出来。class 是地址引用类型,那么在赋值的时候,就会复制地址,也就是一个新的指向原来地址的指针
- 这就会导致class中,新赋值的class对象中成员变量值修改了,旧的class对象中成员变量的值也会被修改。
struct SRectangle {
var width = 50
var height = 50
}
class CRectangle {
var width = 50
var height = 50
}
var sOld = SRectangle()
var sNew = sOld
sOld.width = 100
//这里 sNew.width 值是 50 不受影响
var cOld = CRectangle()
var cNew = cOld
cOld.width = 100
//这里 cNew.width 值也变成了 100
成员变量
struct 是值引用类型,所以整个对象是一个整体,他实例对象如果是用 let 修饰的,那么无论里面成员变量是用 var 还是 let 修饰 ,其成员变量的值都是不可改变的。
struct Rectangle {
var width = 50
var height = 50
}
//调用
let myRectangle = Rectangle()
//myRectangle.width = 100
//这里如果调用就会报错,说他是不能改变的
class 是地址引用类型的,即使对象是 let 修饰也是可以修改里面的成员变量
class Rectangle {
var width = 50
var height = 50
}
//调用
let myRectangle = Rectangle()
myRectangle.width = 100
//这里调用就是没有问题的
继承
struct无法继承,class可以继承
extension 使用
struct 在 extension 中添加方法来修改成员变量的值的时候,需要在方法前加 mutating ,class 则不需要