本文首发于我的个人博客
前言
- 在 Swift 标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很小一部分
- 比如Bool、Int、Double、 String、Array、Dictionary等常见类型都是结构体
1 | struct Date { |
- 所有的结构体都有一个编译器自动生成的初始化器(initializer,初始化方法、构造器、构造方法)
- 在最后一行调用的,可以传入所有成员值,用以初始化所有成员(存储属性,Stored Property)
结构体的初始化器
- 编译器会根据情况,可能会为结构体生成多个初始化器,宗旨是:保证所有成员都有初始值
eg:
1 | struct Point{ |
如果给定一个初始值
1 |
|
如果x 和 y都有初始值的话,就怎么都不会报错了,因为 所有成员都有初始值
1 |
|
初始值为nil的话,也可以编译通过,比如下面这种
1 |
|
自定义初始化器
- 一旦在定义结构体时自定义了初始化器,编译器就不会再帮它自动生成其他初始化器
1 |
|
窥探初始化器的本质
以下2段代码完全等效
1 | struct Point { |
验证
1 | func test(){ |
和
1 | func test(){ |
查看汇编,两段代码都是
1 | testSwift`init() in Point #1 in test(): |
这两段代码的汇编一样的,也就是说,这两段代码完全等效
结构体的内存结构
1 |
|
打印结果为
17
24
8
是因为内存对齐的缘故,17是因为 实际使用的是 8+8+1 = 17
24 是因为,要内存对齐,8*3 = 24
参考资料: