swift中Class和Struct的區別

寫程式碼的少年發表於2019-03-18

類(class)和結構體(struct),不止在iOS開發中,在其他各種語言開發中都屬於老生常談的問題了,在看class和struct之前,我們先看一下引用型別和結構體的概念。

引用型別:將一個物件賦值給另一個物件時,系統不會對此物件進行拷貝,而會將指向這個物件的指標賦值給另一個物件,當修改其中一個物件的值時,另一個物件的值會隨之改變。

值型別:將一個物件賦值給另一個物件時,會對此物件進行拷貝,複製出一份副本給另一個物件,在修改其中一個物件的值時,不影響另外一個物件。

在swift中,類屬於引用型別,結構體屬於值型別,相對於其他語言來說,swift的結構體功能更加強大,它除了支援在結構體宣告中基礎變數之外,它還支援在結構體中宣告方法,這相對於其他語言來說,是swift的一個特性之一。此外,除了引用型別和值型別的區別之外,他們還有其他的不同點,下面總結一下在swift中類和結構體的不同點:

不同點:1.類屬於引用型別,結構體屬於值型別

2.類允許被繼承,結構體不允許被繼承

3.類中的每一個成員變數都必須被初始化,否則編譯器會報錯,而結構體不需要,編譯器會自動幫我們生成init函式,給變數賦一個預設值

下面我們通過程式碼來看一下,在swift中類(引用型別)和結構體(值型別)具體表現出有何不同:

首先我們宣告一個ClassTest類,其中宣告瞭兩個變數number和name

class ClassTest {

var number: Int = 0

var name: String = "test"
複製程式碼

}

宣告一個aTest,輸出aTest的值,之後將aTest賦值給bTest,並改變bTest的值,相對應的,aTest的值也會被改變

    letaTest =ClassTest()

    print("number is \(aTest.number)")

    print("name is \(aTest.name)")

    //以上兩行程式碼會輸出number is 0和number is test



    letbTest = aTest

    bTest.number=5

    bTest.name="testAAA

    //改變了bTest中的值,由於類是引用型別,相對於的aTest中的值也會被改變



    print("number is \(aTest.number)")

    print("number is \(aTest.name)")

    //此時aTest中的number為5,name為testAAA
複製程式碼

如果我們將類換成結構體,那會是什麼情況呢?很明顯,根據值型別的特性,當我們改變b的值時,不會影響到a的值。

structStructTest {

varnumber:Int=1

varname:String="struct"
複製程式碼

}

宣告aStruct,列印其中的值為預設值,宣告bStruct,並且將aStruct賦值給bStruct,改變b的值並不會影響a中的值。

    letaStruct =StructTest()

    print(aStruct.number)

    print(aStruct.name)

    //控制檯輸出1和struct



    varbStruct = aStruct

    bStruct.number=10

    bStruct.name="myTestStruct"

    print(bStruct.number)

    print(bStruct.name)

    print(aStruct.number)

    print(aStruct.name)

    //此時輸出bStruct的值,會輸出10和myTestStruct,而aStruct中的值不會被影響,仍然輸出1和struct
複製程式碼

以上關於類和結構體的異同就講到這裡,感興趣的同學可以在深究,在swift中,許多新特性相對於其他語言來說更有意思,比如結構體中也可以宣告方法,這意味著我們在使用結構體時,可以更加靈活。

相關文章