在Swift标准库中,绝大多数的公开类型都是结构体,例如Bool、Int、Double、Array等常见类型都是结构体
所有的结构体都有一个编译器自动生成的初始化器,声明一个Test的结构体,代码如下:
struct Test { var x: Int var y: Int }
发现上面四种创建方式,只有第一种不会报错,可以推断出结构体的初始化,需要保证结构体中的变量具有初始值
我们可以用一下方式去验证,改变结构体的声明方式,对x、y分别进行赋值代码如下:
只对x进行赋值初始值
struct Test { var x: Int = 1 var y: Int }
只对y进行赋值:
struct Test { var x: Int var y: Int = 1 }
对x、y进行赋值:
struct Test { var x: Int = 1 var y: Int = 1 }
结构体是值类型,值类型赋值给var、let或者给函数传参,是直接将所有内容拷贝一份,也就是深拷贝
var test = Test(x: 1, y: 1) var test1 = test print(Mems.ptr(ofVal: &test)) print(Mems.ptr(ofVal: &test1)) //0x00007ffeea84c1b0 //0x00007ffeea84c1a0
相应的汇编代码:
movl $0x1, %eax movq %rax, %rdi movq %rax, %rsi movq %rax, -0x60(%rbp) callq 0x106503ba0 movq %rax, -0x30(%rbp) movq %rdx, -0x28(%rbp) movq %rax, -0x40(%rbp) movq %rdx, -0x38(%rbp)