1. 程式人生 > 實用技巧 >Swift中的結構體

Swift中的結構體

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