swift之類與值型別引用型別區別

2021-10-05 18:35:23 字數 3577 閱讀 3045

二、值型別、引用型別

class

test

//編譯失敗,class 'test' has no initializers

class

test

let t1 =

test()

//不報錯

let t2=

test

(a:1

,b:2

)//argument passed to call that takes no arguments

/*類的定義和結構體類似,但編譯器沒有為類自動生成可以傳入成員值的建構函式

*/

/*

1、如果類的成員都在定義的時候指定初始值編譯器會為類生成無參的建構函式

2、成員的初始化是在這個建構函式中完成

*/class

test2

class

test2

}let t1 =

test1()

let t2 =

test2()

print

(t1.a)

print

(t2.a)11

class

test

}let t1 =

test

(a:1

,b:2

)print

(t1.a)

print

(t1.b)12

/*嚴格來說,初始化方法不需要返回值,初始化方法是為了讓初始化物件能夠完全地、正確無誤地完成初始化。所以即使你返回了乙個nil來觸發失敗,這並不表明初始化成功了。

*/init

?(引數名 :引數型別)

//條件通過執行下面的**,即表示可繼續初始化

//code...

}

class

test1

/*結構體是值型別、類是引用型別即指標型別

*///類向堆空間申請

0x1000010db

>

: callq 0x100001810

; test.

test1

.__allocating_init()

-> test.

test1 at main.swift:

10x1000010e0

>

: movq 0xf19

(%rip)

,%rcx ;

(void *

)0x00007fff8d9029d8

: type metadata for

any0x1000010e7

>

: addq $0x8

,%rcx

0x1000010ee

>

: movq %rax,

0x2113

(%rip)

struct

test2

; test.t1 : test.

test1

//結構體是值型別,直接是字面量的拷貝

test`test2

.init()

:->

0x100000b60

>

: pushq %rbp

0x100000b61

>

: movq %rsp,

%rbp

0x100000b64

>

: xorps %xmm0,

%xmm0

0x100000b67

>

: movaps %xmm0,

-0x10

(%rbp)

0x100000b6b

>

: movq $0x3,-

0x10

(%rbp)

0x100000b73

>

: movq $0x4,-

0x8(

%rbp)

0x100000b7b

>

: movl $0x3

,%eax

0x100000b80

>

: movl $0x4

,%edx

0x100000b85

>

: popq %rbp

0x100000b86

>

: retq

/*

1、值型別賦值給var、let或者給函式傳參,直接將所有內容拷貝乙份

2、類似檔案的複製貼上,deep copy

3、在swift標準庫中,string、array、dictionary、set採取了copy on write的技術,只有在寫操作才會進行拷貝操作

4、建議不需要修改的定義成為常量let

1、引用賦值給var、let或者給函式傳參,是將記憶體位址拷貝乙份,存的是記憶體位址

2、類似於製作檔案快捷方式(替身),指向同乙個檔案,屬於淺拷貝

Swift值型別和引用型別

的乙份,比如結構體 struct 列舉 enum 元組 tuple 都是值型別。第二種是引用型別,該型別的例項共享資料唯一的乙份副本 在native層面說的話,就是該型別的每個例項都指向記憶體中的同乙個位址 比如類 class 就是引用型別。在這篇文章中,我們將深入 值型別和引用型別的使用價值,以及...

Swift 值型別和引用型別

swift中有兩種型別 值型別 value type 引用型別 reference type 在swift中,所有的基本型別 整型 int 浮點型 float 布林型別 boolean 字串型別 string 陣列 array 字典 dictionary 元組 tuple 都是值型別,它們的底層都是...

swift 值型別和引用型別

值型別被賦予給乙個變數,常數或者本身被傳遞給乙個函式的時候,實際上操作的是其的拷貝。在 swift 中,所有的基本型別 整數 integer 浮點數 floating point 布林值 booleans 字串 string 陣列 array 和字典 dictionaries 都是值型別,並且都是以...