在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)