用 "protocol" 關(guān)鍵字來聲明一個協(xié)議。例:

注:對于類如果方法中要修改 self;對于結(jié)構(gòu)體,枚舉,如果方法中要修改 self 或者是 self的成員變量,在這種情況下,要使用"mutating" 關(guān)鍵字,來標(biāo)明這個方法對 self 做了修改。(由于類是引用類型,而結(jié)構(gòu)體和枚舉是數(shù)值類型。所以,枚舉和結(jié)構(gòu)體的方法,即便是要修改self的成員變量,也要使用 mutating)
類,枚舉,結(jié)構(gòu)體都可以實(shí)現(xiàn)協(xié)議。例:

注意,在 SimpleStructure 聲明時,使用了 "mutating" 關(guān)鍵字,來標(biāo)明對結(jié)構(gòu)體的修改。而在 SimpleClass 的聲明中,不需要在方法前使用 "mutating"關(guān)鍵字來標(biāo)記。因?yàn)椋惖姆椒偸悄軐︻愡M(jìn)行修改。(實(shí)例方法如果要修改self的話,也要使用 "mutating")
使用 "extension" 關(guān)鍵字來為一個存在的類型(type,之所以這里用“類型”一詞,是因?yàn)閟wift中,不單單是類可以有 extension,而且結(jié)構(gòu)體,枚舉,甚至是Float,Int這種數(shù)據(jù)類型,都能有extension。注意是Float,Int而不是float,int。前者是結(jié)構(gòu)體化了的float,int)添加功能,例如一些新的方法和計(jì)算屬性。你可以使用擴(kuò)展來為聲明在他處的類型,添加代理實(shí)現(xiàn),或者甚至是為你從庫或者框架中導(dǎo)入的類型(添加功能)。例:

擴(kuò)展實(shí)際上對于項(xiàng)目架構(gòu)有諸多好處,靈活運(yùn)用組合的方式來編程,比使用繼承的方式好的多得多。同時,使用過pods或者是使用過第三方庫的開發(fā)者都知道,如果要對第三方庫做修改,那么最好的辦法就是為第三方庫中對應(yīng)的類添加擴(kuò)展,而不是直接在第三方庫中做修改。凡此種種,在項(xiàng)目中慢慢體會,必然會對擴(kuò)展愛不釋手。
你可以將一個協(xié)議像命名類型一樣使用——比如,創(chuàng)建一個對象集合,集合中的對象有著不同的類型,但是都遵循同一個協(xié)議。當(dāng)你在操作一個類型為協(xié)議類型的值時,協(xié)議定義之外方法是不可用的。(顯而易見)例:

即使變量 protocolValue 有一個運(yùn)行時類型 —— SimpleClass,編譯器仍舊使用ExampleProtocol類型來處理它。這就意味著,你不能使用協(xié)議實(shí)現(xiàn)之外的,類中實(shí)現(xiàn)的方法或者屬性。(簡而言之,運(yùn)行時protocolValue的類型是SimpleClass,但是protocolValue不能使用SimpleClass中,除開ExampleProtocol協(xié)議之外的方法和屬性。因?yàn)?,編譯器始終認(rèn)為protocolValue的類型是ExampleProtocol而不是SimpleClass)