類和結(jié)構(gòu)體是人們構(gòu)建代碼所用的一種通用且靈活的構(gòu)造體。在Swift中類和結(jié)構(gòu)體類似,可以把結(jié)構(gòu)體理解成是一種輕量級的類。
1.類和結(jié)構(gòu)體的定義
類是一種復(fù)雜的數(shù)據(jù)類型,它將不同類型的數(shù)據(jù)和與這些數(shù)據(jù)的相關(guān)操作封裝在一起,其中“數(shù)據(jù)的相關(guān)操作”就是方法,方法可能要明天更新。
結(jié)構(gòu)體和類相似,用來封裝具有相同類型活不同類型的一系列數(shù)據(jù)。但是在C和OC中,結(jié)構(gòu)體功能單一,很少使用。在Swift中,結(jié)構(gòu)體不僅可以定義成員變量還可以定義成員方法,是一種很重要的數(shù)據(jù)類型。
下面來看一下類和結(jié)構(gòu)體的語法格式。
類的語法格式:
class name: super class { // name即類名 super class 即父類
code // 在這里定義類的內(nèi)容
}
結(jié)構(gòu)體的語法格式:
struct name { // 結(jié)構(gòu)體名稱
fields // 定義結(jié)構(gòu)體的內(nèi)容
}
當(dāng)然在playground中定義一個類,需要跟上面的格式一樣。在一個工程中,用Xcode直接就可以創(chuàng)建一個類,看一下下面的截圖就明白了:

2.類和結(jié)構(gòu)體的實例
(1)類的實例及訪問
class Student {
var age:Int = 0
var name:String = ""
}
var stu = Student()
stu.age = 18
stu.name = "小明"
在上面的代碼中,“Student()”表示使用構(gòu)造函數(shù)創(chuàng)建了一個Student實例,這是創(chuàng)建實例最簡單的一種方式。通過這種方式所創(chuàng)建的類實例,其屬性均會被初始化為默認(rèn)值。
在Swift中,類是引用類型的,與值類型不同,引用類型在被賦予到一個變量、常量或者被傳遞到一個函數(shù)式,其值不會被拷貝。
(2)結(jié)構(gòu)體的實例及訪問
Swift要求實例化一個結(jié)構(gòu)體時,所有成員變量都必須有初始值,構(gòu)造函數(shù)的意義就是用于初始化所有成員變量的。
如果在定義結(jié)構(gòu)體時,所包含的屬性都有默認(rèn)值,那么可以直接使用()來構(gòu)造一個結(jié)構(gòu)體實體。如果結(jié)構(gòu)體中的屬性沒有設(shè)置默認(rèn)值,那么必須使用結(jié)構(gòu)體的構(gòu)造函數(shù)來實例化結(jié)構(gòu)體。下面是代碼:
struct Person {
var age:Int = 0
var name:String = ""
}
var person = Person()
print(person.age)
struct Teacher {
var name:String
var age:Int
}
var tea = Teacher(name: "汪",age: 25)
結(jié)構(gòu)體是值類型,所以在代碼中傳遞的時候都會被復(fù)制。
3.類和結(jié)構(gòu)體對比
共同點:
(1)定義屬性用于存儲值;
(2)定義方法用于提供功能;
(3)定義下標(biāo)用于通過小兵語法訪問值;
(4)定義構(gòu)造函數(shù)用于生成初始化值;
(5)通過擴展以增加默認(rèn)實現(xiàn)的功能;
(6)符合協(xié)議以對某類聽標(biāo)準(zhǔn)功能。
與結(jié)構(gòu)體相比,類還有一些結(jié)構(gòu)體不具備的特性:
(1)集成允許一個類繼承另一個類的特征;
(2)類型轉(zhuǎn)換允許一個類實例釋放任何其所被分配的資源;
(3)取消構(gòu)造函數(shù)允許一個類實例釋放任何其所被分配的資源;
(4)引用計數(shù)允許對一個類的多次引用。