較傳統(tǒng)的OC語言,Swift使用了更多的結(jié)構(gòu)體,在 Swift 中,所有的基本類型,都是結(jié)構(gòu)體類型
- 整數(shù)(Integer)
- 浮點(diǎn)數(shù)(floating-point)
- 布爾值(Boolean)
- 字符串(string)
- 數(shù)組(array)
- 字典(dictionary)
在比較類和結(jié)構(gòu)體之間的區(qū)別之前,先了解兩個概念唧垦,引用類型和值類型:
引用類型
引用類型在被賦予到一個變量、常量或者被傳遞到一個函數(shù)時,其值不會被拷貝漆撞。因此,引用的是已存在的實(shí)例本身而不是其拷貝
值類型
它們的實(shí)例于宙,以及實(shí)例中所包含的任何值類型屬性浮驳,在代碼中傳遞的時候都會被復(fù)制
類和結(jié)構(gòu)體對比
本質(zhì)區(qū)別:
- 類是引用類型,實(shí)例是通過引用傳遞
- 結(jié)構(gòu)體是值類型捞魁,實(shí)例是通過值傳遞
Swift 中類和結(jié)構(gòu)體有很多共同點(diǎn)
- 定義屬性用于存儲值
- 定義方法用于提供功能
- 定義下標(biāo)操作使得可以通過下標(biāo)語法來訪問實(shí)例所包含的值
- 定義構(gòu)造器用于生成初始化值
- 通過擴(kuò)展以增加默認(rèn)實(shí)現(xiàn)的功能
- 實(shí)現(xiàn)協(xié)議以提供某種標(biāo)準(zhǔn)功能
與結(jié)構(gòu)體相比至会,類還有如下的附加功能
- 繼承允許一個類繼承另一個類的特征
- 類型轉(zhuǎn)換允許在運(yùn)行時檢查和解釋一個類實(shí)例的類型
- 析構(gòu)器允許一個類實(shí)例釋放任何其所被分配的資源
- 引用計(jì)數(shù)允許對一個類的多次引用
結(jié)構(gòu)體和類的定義語法
結(jié)構(gòu)體定義語法
struct SomeStructure {
// 在這里定義結(jié)構(gòu)體
}
所有結(jié)構(gòu)體都有一個自動生成的成員逐一構(gòu)造器,用于初始化新結(jié)構(gòu)體實(shí)例中成員的屬性
類定義語法 (一)
不繼承NSObject的類谱俭,叫做基類
class SomeClass {
// 在這里定義類
}
類定義語法 (二)
這種類繼承自NSObject,可以使用OC中的 NSObject 的特性 eg:KVO,runtime
class SomeClass: NSObject {
// 在這里定義類
}
類和結(jié)構(gòu)體使用注意
類是引用類型奉件,其屬性如果是可變類型,可以直接修改昆著,修改后類型不變
結(jié)構(gòu)體是值類型县貌,初始化完成后,一般情況下凑懂,不允許修改其屬性煤痕;如果修改其屬性,會生成一個新的結(jié)構(gòu)體接谨;如果想不改變結(jié)構(gòu)體的類型摆碉,需要定義一個mutating修飾的方法,專門用來修改其屬性
寫時復(fù)制 (copy-on-write)
Swift用了大量的結(jié)構(gòu)體疤坝,每次修改都是復(fù)制一份兆解,是不是很浪費(fèi)內(nèi)存?
答:在 Swift 標(biāo)準(zhǔn)庫中跑揉,像是 Array锅睛,Dictionary 和 Set 這樣的集合類型是通過一種叫做寫時復(fù)制 (copy-on-write) 的技術(shù)實(shí)現(xiàn)的埠巨,該技術(shù)優(yōu)化了這一問題,讓結(jié)構(gòu)體在核合適的時候才進(jìn)行復(fù)制现拒。
類和結(jié)構(gòu)體的選擇
當(dāng)符合一條或多條以下條件時辣垒,請考慮構(gòu)建結(jié)構(gòu)體:
- 該數(shù)據(jù)結(jié)構(gòu)的主要目的是用來封裝少量相關(guān)簡單數(shù)據(jù)值;
- 有理由預(yù)計(jì)該數(shù)據(jù)結(jié)構(gòu)的實(shí)例在被賦值或傳遞時印蔬,封裝的數(shù)據(jù)將會被拷貝而不是被引用勋桶;
- 該數(shù)據(jù)結(jié)構(gòu)中儲存的值類型屬性,也應(yīng)該被拷貝侥猬,而不是被引用例驹;
- 該數(shù)據(jù)結(jié)構(gòu)不需要去繼承另一個既有類型的屬性或者行為。