swift中Class和Struct的區別

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

引用類型:將一個對象賦值給另外一個對象時,系統不會對此對象進行拷貝,而會將指向這個對象的指針賦值給另外一個對象,當修改其中一個對象的值時,另外一個對象的值會隨之改變。函數

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

在swift中,類屬於引用類型,結構體屬於值類型,相對於其餘語言來講,swift的結構體功能更增強大,它除了支持在結構體聲明中基礎變量以外,它還支持在結構體中聲明方法,這相對於其餘語言來講,是swift的一個特性之一。此外,除了引用類型和值類型的區別以外,他們還有其餘的不一樣點,下面總結一下在swift中類和結構體的不一樣點:指針

不一樣點:1.類屬於引用類型,結構體屬於值類型code

2.類容許被繼承,結構體不容許被繼承對象

3.類中的每個成員變量都必須被初始化,不然編譯器會報錯,而結構體不須要,編譯器會自動幫咱們生成init函數,給變量賦一個默認值繼承

下面咱們經過代碼來看一下,在swift中類(引用類型)和結構體(值類型)具體表現出有何不一樣:開發

首先咱們聲明一個ClassTest類,其中聲明瞭兩個變量number和name編譯器

class ClassTest {it

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中,許多新特性相對於其餘語言來講更有意思,好比結構體中也能夠聲明方法,這意味着咱們在使用結構體時,能夠更加靈活。

相關文章
相關標籤/搜索