目录
一,结构体
二,类
三,闭包
一,结构体
1,介绍
-
Bool
、Int
、String
、Array
、Dictionary
等常见类型都是结构体 - 编译器会为结构体自动生成一个或多个初始化器,宗旨是保证所有成员都有初始值
- 如果自定义了初始化器,编译器就不会自动生成
- 在结构体内部定义的函数叫做方法
2,实例
3,值类型
- 介绍
1>结构体是值类型
2>值类型在赋值或传参时,会产生深拷贝
3>在函数内部使用时,变量和成员都存储在栈空间
4>如果将值类型声明为常量,那么变量和成员都不能被修改
- 实例(查看内存的工具)
4,内存
二,类
1,介绍
- 在无初始值的情况下,编译器不会为类自动生成初始化器
- 在有初始值的情况下,编译器会为类自动生成一个无参的初始化器
- 成员的初始化是在初始化器中完成的
- 在类内部定义的函数叫做方法
2,实例
3,引用类型
- 介绍
1>类是引用类型
2>引用类型在赋值或传参时,会产生浅拷贝
3>在函数内部使用时,变量存储在栈空间,成员存储在堆空间
4>堆空间的前16个字节用来存储类型信息和引用计数
5>如果将引用类型声明为常量,那么变量不能被修改,而成员可以被修改
- 实例
4,值类型和引用类型
- 实例
- 图解
5,内存
三,闭包
1,闭包表达式
- 格式
- 简写
2,尾随闭包
- 条件:闭包表达式作为函数的最后一个实参
- 格式:将闭包表达式写在圆括号的外面
3,自动闭包
-
@autoclosure
并非只支持最后一个参数 -
@autoclosure
只支持() -> T
格式的参数 - 有无
@autoclosure
会构成函数重载
4,变量捕获
- 实例
- 为何捕获
number
存储在栈空间,当test
函数执行完就会销毁,但plus
函数还会用到它,所以就将number
捕获到堆空间,以延长它的寿命
- 底层操作
第19行代码
1>将plus
函数的地址存储到ps
变量的前8个字节中
2>申请一份堆空间:类型信息占8个字节、引用计数占8个字节、number
的值占8个字节
3>将堆空间的地址存储到ps
变量的后8个字节中
第20、21、22行代码
1>从ps
变量中取出plus
函数和堆空间的地址
2>调用plus
函数并将2、3、4和堆空间的地址作为参数传递进去
3>从堆空间中取出number
的值,与2、3、4相加之后再存储进去
- 汇编分析
第19行代码
第20行代码
5,闭包
- 一个函数和它捕获的局部常量/变量组合起来称为闭包
- 都是存储在堆空间,可以把闭包想象成类的实例对象