在Swift标准库中,绝大多数的公开类型都是结构体,例如Bool、Int、Double、Array等常见类型都是结构体函数
全部的结构体都有一个编译器自动生成的初始化器,声明一个Test的结构体,代码以下:spa
struct Test { var x: Int var y: Int }
发现上面四种建立方式,只有第一种不会报错,能够推断出结构体的初始化,须要保证结构体中的变量具备初始值3d
咱们能够用一下方式去验证,改变结构体的声明方式,对x、y分别进行赋值代码以下:code
只对x进行赋值初始值blog
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或者给函数传参,是直接将全部内容拷贝一份,也就是深拷贝class
var test = Test(x: 1, y: 1) var test1 = test print(Mems.ptr(ofVal: &test)) print(Mems.ptr(ofVal: &test1)) //0x00007ffeea84c1b0 //0x00007ffeea84c1a0
相应的汇编代码:test
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)