概述
相对Objective-C, Swift使用结构体Struct的比例大大增加了,其中Int, Bool,以及String,Array等底层全部使用Struct来定义!在Swift中结构体不仅可以定义成员变量(属性),还可以定义成员方法,和类比较相似,都是具有定义和使用属性,方法以及初始化器等面向对象特性,但是结构体是不具有继承性,不具备运行时强制类型转换的以及引用计数等能力的!
下面来从汇编角度分析struct与class的区别!
基本知识
1、结构体
自动初始化器
在63行的调用中可以传入所有的成员值,用以初始化所有成员(存储属性, Stored Property)

在Struct Date定义中,并没有出现init初始化方法,但是发现Date会自动出现填入成员值的初始化方法
结论所有结构体都会有一个编译器自动生成的初始化器(initializer,构造器,构造方法),编译器会根据情况,可能会为结构体生成多个初始化器,但是宗旨是:保证所有成员都有初始值
举例1
下面四个初始化器,第一个初始化器之后保证了x,y都有值,满足了上面说的保证所有成员都有初始值

p1,p2,p3都不能操作成功,因为不能保证全部成员值都有值
通过上面的举例,编译器主动生成了一个初始化器,用于接受成员值x,y的初始化器,其他不会主动生成
举例2
下面四个初始化器,第一个第二个p0,p1保证了x,y都有值,因为x定义的时候赋值为0了,保证了成员值都有初始化值

p2,p3都不能操作成功,因为不能保证全部成员值都有值
通过举例2,编译器主动生成了两个初始化器,用于接受x,y以及单独接受y即可,其他的初始化器不会生成
举例3
下面成员值在定义的时候就已经给定了初始化值,已经保证了所有成员值肯定会有初始化值

所以四个初始化器都可以,编译器会自动生成四个初始化器
举例4
下面代码能编译通过嘛?
struct Point {
var x: Int?
var y: Int?
}
var p0 = Point(x: 0, y: 10)
var p1 = Point(y: 0)
var p2 = Point(x: 0)
var p3 = Point()
定义var x: Int? 相当于将nil 赋值给x,所以上面四个都是可以编译通过的 可选项都有个默认值nil

自定义初始化器
一旦在定义结构体的时候自定义好了初始化器,编译器就不会再帮它自动生成其他初始化器
举例1








