Swift 并不要求你為自定義類和結(jié)構(gòu)去創(chuàng)建獨(dú)立的接口和實(shí)現(xiàn)文件直晨。你所要做的是在一個(gè)單一文件中定義一個(gè)類或者結(jié)構(gòu)體,系統(tǒng)將會(huì)自動(dòng)生成面向其它代碼的外部接口帜羊。
注意通常一個(gè)類的實(shí)例被稱為對(duì)象系吭。然而在 Swift 中咙鞍,類和結(jié)構(gòu)體的關(guān)系要比在其他語言中更加的密切谬擦,本章中所討論的大部分功能都可以用在類和結(jié)構(gòu)體上凹髓。因此,我們會(huì)主要使用實(shí)例而不是對(duì)象怯屉。
類和結(jié)構(gòu)體對(duì)比
Swift 中類和結(jié)構(gòu)體有很多共同點(diǎn)。共同處在于:
- 定義屬性用于存儲(chǔ)值
- 定義方法用于提供功能
- 定義附屬腳本用于訪問值
- 定義構(gòu)造器用于生成初始化值
- 通過擴(kuò)展以增加默認(rèn)實(shí)現(xiàn)的功能
- 實(shí)現(xiàn)協(xié)議以提供某種標(biāo)準(zhǔn)功能
與結(jié)構(gòu)體相比饵沧,類還有如下的附加功能:
- 繼承允許一個(gè)類繼承另一個(gè)類的特征
- 類型轉(zhuǎn)換允許在運(yùn)行時(shí)檢查和解釋一個(gè)類實(shí)例的類型
- 解構(gòu)器允許一個(gè)類實(shí)例釋放任何其所被分配的資源
- 引用計(jì)數(shù)允許對(duì)一個(gè)類的多次引用
定義語法
class SomeClass {
// class definition goes here
}
struct SomeStructure {
// structure definition goes here
}
因此請(qǐng)使用UpperCamelCase這種方式來命名(如SomeClass和SomeStructure等)锨络,以便符合標(biāo)準(zhǔn) Swift 類型的大寫命名風(fēng)格(如String,Int和Bool)狼牺。
請(qǐng)使lowerCamelCase這種方式為屬性和方法命名(如framerate和incrementCount)羡儿,以便和類型名區(qū)分。
結(jié)構(gòu)體和枚舉是值類型
值類型被賦予給一個(gè)變量是钥、常量或者被傳遞給一個(gè)函數(shù)的時(shí)候掠归,其值會(huì)被拷貝。
我們已經(jīng)大量使用了值類型悄泥。實(shí)際上虏冻,在 Swift 中,所有的基本類型:整數(shù)(Integer)弹囚、浮點(diǎn)數(shù)(floating-point)厨相、布爾值(Boolean)、字符串(string)鸥鹉、數(shù)組(array)和字典(dictionary)蛮穿,都是值類型,并且在底層都是以結(jié)構(gòu)體的形式所實(shí)現(xiàn)毁渗。
在 Swift 中践磅,所有的結(jié)構(gòu)體和枚舉類型都是值類型。這意味著它們的實(shí)例灸异,以及實(shí)例中所包含的任何值類型屬性府适,在代碼中傳遞的時(shí)候都會(huì)被復(fù)制羔飞。
類是引用類型
與值類型不同,引用類型在被賦予到一個(gè)變量细溅、常量或者被傳遞到一個(gè)函數(shù)時(shí)褥傍,其值不會(huì)被拷貝。因此喇聊,引用的是已存在的實(shí)例本身而不是其拷貝恍风。
恒等運(yùn)算符
因?yàn)轭愂且妙愋停锌赡苡卸鄠€(gè)常量和變量在幕后同時(shí)引用同一個(gè)類實(shí)例誓篱。
如果能夠判定兩個(gè)常量或者變量是否引用同一個(gè)類實(shí)例將會(huì)很有幫助朋贬。為了達(dá)到這個(gè)目的,Swift 內(nèi)建了兩個(gè)恒等運(yùn)算符:
- 等價(jià)于(===)
- 不等價(jià)于(!==)
運(yùn)用這兩個(gè)運(yùn)算符檢測兩個(gè)常量或者變量是否引用同一個(gè)實(shí)例:
指針
一個(gè)引用某個(gè)引用類型實(shí)例的 Swift 常量或者變量窜骄,與 C 語言中的指針類似锦募,但是并不直接指向某個(gè)內(nèi)存地址,也不要求你使用星號(hào)(*
)來表明你在創(chuàng)建一個(gè)引用邻遏。Swift 中的這些引用與其它的常量或變量的定義方式相同糠亩。
字符串(String)、數(shù)組(Array)准验、和字典(Dictionary)類型的賦值與復(fù)制行為
Swift 中赎线,許多基本類型,諸如String糊饱,Array和Dictionary類型均以結(jié)構(gòu)體的形式實(shí)現(xiàn)垂寥。這意味著被賦值給新的常量或變量,或者被傳入函數(shù)或方法中時(shí)另锋,它們的值會(huì)被拷貝滞项。
Objective-C 中NSString,NSArray和NSDictionary類型均以類的形式實(shí)現(xiàn)夭坪,而并非結(jié)構(gòu)體文判。它們?cè)诒毁x值或者被傳入函數(shù)或方法時(shí),不會(huì)發(fā)生值拷貝室梅,而是傳遞現(xiàn)有實(shí)例的引用律杠。