類和結(jié)構(gòu)體
1.Swift不需要你為自定義類和結(jié)構(gòu)體創(chuàng)建獨(dú)立的接口和實(shí)現(xiàn)文件。在 Swift 中,你在一個(gè)文件中定義一個(gè)類或者結(jié)構(gòu)體, 則系統(tǒng)將會(huì)自動(dòng)生成面向其他代碼的外部接口。
2.類與結(jié)構(gòu)體的對比:
在 Swift 中類和結(jié)構(gòu)體有很多共同之處,它們都能:
- 定義屬性用來存儲(chǔ)值;
- 定義方法用于提供功能;
- 定義下標(biāo)腳本用來允許使用下標(biāo)語法訪問值;
- 定義初始化器用于初始化狀態(tài);
- 可以被擴(kuò)展來默認(rèn)所沒有的功能;
- 遵循協(xié)議來針對特定類型提供標(biāo)準(zhǔn)功能。
類有而結(jié)構(gòu)體沒有的額外功能:
- 繼承允許一個(gè)類繼承另一個(gè)類的特征;
- 類型轉(zhuǎn)換允許你在運(yùn)行檢查和解釋一個(gè)類實(shí)例的類型;
- 反初始化器允許一個(gè)類實(shí)例釋放任何其所被分配的資源;
- 引用計(jì)數(shù)允許不止一個(gè)對類實(shí)例的引用。
3.結(jié)構(gòu)體在你的代碼中通過復(fù)制來傳遞,并且并不會(huì)使用引用計(jì)數(shù)。
4.定義:無論你在何時(shí)定義了一個(gè)新的類或者結(jié)構(gòu)體,實(shí)際上你定義了一個(gè)全新的 Swift 類型。
class SomeClass {
// class definition goes here
}
struct SomeStructure {
// structure definition goes here
}
5.初始化器語法最簡單的是在類或結(jié)構(gòu)體名字后面接一個(gè)空的圓括號,例如 Resolution()或者 VideoMode()。
6.結(jié)構(gòu)體類型的成員初始化器
struct Resolution {
var width = 0
var height = 0
}
let vga = Resolution(width: 640, height: 480)
7.結(jié)構(gòu)體和枚舉是值類型
值類型是一種當(dāng)它被指定到常量或者變量,或者被傳遞給函數(shù)時(shí)會(huì)被拷貝的類型。
Swift 中所有的結(jié)構(gòu)體和枚舉都是值類型,這意味著你所創(chuàng)建的任何結(jié)構(gòu)體和枚舉實(shí)例——和實(shí)例作為屬性所包含的任意值類型——在代碼傳遞中總是被拷貝的。
8.類是引用類型
相對于拷貝,這里使用的是同一個(gè)對現(xiàn)存實(shí)例的引用。
9.有時(shí)候找出兩個(gè)常量或者變量是否引用自同一個(gè)類實(shí)例非常有用,為了允許這樣,Swift提供了兩個(gè)特點(diǎn)運(yùn)算符:
- 相同于 ( ===),意味著兩個(gè)類類型常量或者變量引用自相同的實(shí)例;
- 不相同于( !==)
10.按照通用準(zhǔn)則,當(dāng)符合以下一條或多條情形時(shí)應(yīng)考慮創(chuàng)建一個(gè)結(jié)構(gòu)體:
- 結(jié)構(gòu)體的主要目的是為了封裝一些相關(guān)的簡單數(shù)據(jù)值;
- 當(dāng)你在賦予或者傳遞結(jié)構(gòu)實(shí)例時(shí),有理由需要封裝的數(shù)據(jù)值被拷貝而不是引用;
- 任何存儲(chǔ)在結(jié)構(gòu)體中的屬性是值類型,也將被拷貝而不是被引用;
- 結(jié)構(gòu)體不需要從一個(gè)已存在類型繼承屬性或者行為。
11.字符串,數(shù)組和字典的賦值與拷貝行為
Swift 的 String , Array 和 Dictionary類型是作為結(jié)構(gòu)體來實(shí)現(xiàn)的,這意味著字符串,數(shù)組和字典在它們被賦值到一個(gè)新的常量或者變量,亦或者它們本身被傳遞到一個(gè)函數(shù)或方法中的時(shí)候,其實(shí)是傳遞了拷貝。
12.在上述有關(guān)字符串,數(shù)組和字典“拷貝”的描述中。你在代碼中所見到的行為好像總是拷貝。然而在后臺 Swift 只有在需要這么做時(shí)才會(huì)實(shí)際去拷貝。Swift 能夠管理所有的值的拷貝來確保最佳的性能,所有你也沒必要為了保證最佳性能來避免賦值。