Swift-修飾符解釋

import (導(dǎo)入聲明)

導(dǎo)入聲明(import declaration) 讓你可以使用在其他文件中聲明的內(nèi)容。導(dǎo)入語(yǔ)句的基本形式是導(dǎo)入整個(gè)模塊啤誊,它由 import 關(guān)鍵字和緊隨其后的模塊名組成:

import 模塊

可以對(duì)導(dǎo)入操作提供更細(xì)致的控制捐寥,如指定一個(gè)特殊的子模塊或者指定一個(gè)模塊或子模塊中的某個(gè)聲明帽驯。提供了這些限制后寸痢,在當(dāng)前作用域中赴邻,只有被導(dǎo)入的符號(hào)是可用的印衔,而不是整個(gè)模塊中的所有聲明。

import 導(dǎo)入類型 模塊.符號(hào)名
import 模塊.子模塊

let (常量)

常量以關(guān)鍵字 let 來(lái)聲明姥敛,遵循如下格式:

let 常量名稱: 類型 = 表達(dá)式

var (變量)

變量聲明(variable declaration) 可以在程序中引入一個(gè)具有命名的變量奸焙,它以關(guān)鍵字 var 來(lái)聲明。
可以在子類中重寫繼承來(lái)的變量屬性彤敛,使用 override 聲明修飾符標(biāo)記屬性的聲明即可与帆,詳情請(qǐng)參閱 重寫。

  1. 存儲(chǔ)型變量和存儲(chǔ)型變量屬性
    常量以關(guān)鍵字 let 來(lái)聲明臊泌,遵循如下格式:
var 變量名稱: 類型 = 表達(dá)式
  1. 計(jì)算型變量和計(jì)算型屬性
    使用如下形式聲明一個(gè)計(jì)算型變量或計(jì)算型屬性:
var 變量名稱: 類型 {
    get {
        語(yǔ)句
    }
    set(setter 名稱) {
        語(yǔ)句
    }
}
  1. 存儲(chǔ)型變量和屬性的觀察器
    可以在聲明存儲(chǔ)型變量或?qū)傩詴r(shí)提供 willSet 和 didSet 觀察器鲤桥。一個(gè)包含觀察器的存儲(chǔ)型變量或?qū)傩砸匀缦滦问铰暶鳎?/li>
var 變量名稱: 類型 = 表達(dá)式 {
    willSet(setter 名稱) {
        語(yǔ)句
    }
    didSet(setter 名稱) {
        語(yǔ)句
    }
}
  1. 類型變量屬性

要聲明一個(gè)類型變量屬性,用 static 聲明修飾符標(biāo)記該聲明渠概。類可以改用 class 聲明修飾符標(biāo)記類的類型計(jì)算型屬性從而允許子類重寫超類的實(shí)現(xiàn)茶凳。類型屬性在 類型屬性 章節(jié)有詳細(xì)討論嫂拴。

typealias (類型別名)

類型別名(type alias) 聲明可以在程序中為一個(gè)既有類型聲明一個(gè)別名。類型別名聲明語(yǔ)句使用關(guān)鍵字 typealias 聲明贮喧,遵循如下的形式:

typealias 類型別名 = 現(xiàn)存類型

func (函數(shù)聲明)

使用函數(shù)聲明(function declaration) 在程序中引入新的函數(shù)或者方法筒狠。在類、結(jié)構(gòu)體箱沦、枚舉辩恼,或者協(xié)議中聲明的函數(shù)會(huì)作為方法。函數(shù)聲明使用關(guān)鍵字 func谓形,遵循如下的形式:

func 函數(shù)名稱(參數(shù)列表) -> 返回類型 {
    語(yǔ)句
}

如果函數(shù)返回 Void 類型灶伊,返回類型可以省略,如下所示:

func 函數(shù)名稱(參數(shù)列表) {
    語(yǔ)句
}

inout (輸入輸出參數(shù))

輸入輸出參數(shù)被傳遞時(shí)遵循如下規(guī)則:
函數(shù)調(diào)用時(shí)寒跳,參數(shù)的值被拷貝聘萨。
函數(shù)體內(nèi)部,拷貝后的值被修改童太。
函數(shù)返回后米辐,拷貝后的值被賦值給原參數(shù)。
這種行為被稱為拷入拷出(copy-in copy-out) 或值結(jié)果調(diào)用(call by value result)书释。

_ (單參數(shù)省略聲明)

以下劃線(_)命名的參數(shù)會(huì)被顯式忽略翘贮,無(wú)法在函數(shù)內(nèi)使用。

... (可變參數(shù)省略聲明)

一個(gè)參數(shù)的基本類型名稱如果緊跟著三個(gè)點(diǎn)(...)爆惧,會(huì)被視為可變參數(shù)狸页。

mutating (自身修改)

枚舉或結(jié)構(gòu)體的方法如果會(huì)修改 self,則必須以 mutating 聲明修飾符標(biāo)記检激。

override (重寫超類中的方法)

子類重寫超類中的方法必須以 override 聲明修飾符標(biāo)記肴捉。重寫方法時(shí)不使用 override 修飾符,或者被 override 修飾符修飾的方法并未對(duì)超類方法構(gòu)成重寫叔收,都會(huì)導(dǎo)致編譯錯(cuò)誤齿穗。

static (類型方法)

枚舉或者結(jié)構(gòu)體中的類型方法,要以 static 聲明修飾符標(biāo)記饺律,而對(duì)于類中的類型方法窃页,除了使用 static,還可使用 class 聲明修飾符標(biāo)記复濒。類中使用 class 聲明修飾的方法可以被子類實(shí)現(xiàn)重寫脖卖;類中使用 class finalstatic 聲明修飾的方法不可被重寫。

throws (拋出錯(cuò)誤的函數(shù)和方法)

可以拋出錯(cuò)誤的函數(shù)或方法必須使用 throws 關(guān)鍵字標(biāo)記巧颈。這類函數(shù)和方法被稱為拋出函數(shù)和拋出方法畦木。它們有著下面的形式:

func 函數(shù)名稱(參數(shù)列表) throws -> 返回類型 {
    語(yǔ)句
}

拋出函數(shù)或拋出方法的調(diào)用必須包裹在 try 或者 try! 表達(dá)式中(也就是說(shuō),在作用域內(nèi)使用 try 或者 try! 運(yùn)算符)砸泛。

rethrows (重拋錯(cuò)誤的函數(shù)和方法)

函數(shù)或方法可以使用 rethrows 關(guān)鍵字來(lái)聲明十籍,從而表明僅當(dāng)該函數(shù)或方法的一個(gè)函數(shù)類型的參數(shù)拋出錯(cuò)誤時(shí)蛆封,該函數(shù)或方法才拋出錯(cuò)誤。這類函數(shù)和方法被稱為重拋函數(shù)和重拋方法勾栗。重新拋出錯(cuò)誤的函數(shù)或方法必須至少有一個(gè)參數(shù)的類型為拋出函數(shù)惨篱。

func someFunction(callback: () throws -> Void) rethrows {
    try callback()
}

重拋函數(shù)或者方法不能夠從自身直接拋出任何錯(cuò)誤,這意味著它不能夠包含 throw 語(yǔ)句围俘。它只能夠傳遞作為參數(shù)的拋出函數(shù)所拋出的錯(cuò)誤砸讳。例如,在 do-catch 語(yǔ)句中調(diào)用拋出函數(shù)界牡,并在 catch 子句中拋出其它錯(cuò)誤都是不允許的簿寂。

async (異步函數(shù)和方法)

異步運(yùn)行的函數(shù)和方法必須用 async 關(guān)鍵字標(biāo)記。這些函數(shù)和方法稱為異步函數(shù)和異步方法欢揖。它們有著下面的形式:

func 函數(shù)名稱(參數(shù)列表) async -> 返回類型 {
    語(yǔ)句
}

對(duì)異步函數(shù)或異步方法的調(diào)用必須包含在 await 表達(dá)式中陶耍,即它們必須在 await 操作符的作用域內(nèi)。
async 關(guān)鍵字是函數(shù)類型中的一部分她混。同步函數(shù)是異步函數(shù)的子類型。所以泊碑,你可以在使用異步函數(shù)的地方坤按,使用同步函數(shù)。同步方法可以重寫異步方法馒过,且同步方法可以滿足對(duì)異步方法的協(xié)議要求臭脓。

Never (永不返回的函數(shù))

Swift 定義了 Never 類型,它表示函數(shù)或者方法不會(huì)返回給它的調(diào)用者腹忽。Never 返回類型的函數(shù)或方法可以稱為不歸来累,不歸函數(shù)、方法要么引發(fā)不可恢復(fù)的錯(cuò)誤窘奏,要么永遠(yuǎn)不停地運(yùn)作嘹锁,這會(huì)使調(diào)用后本應(yīng)執(zhí)行得代碼就不再執(zhí)行了。但即使是不歸函數(shù)着裹、方法领猾,拋錯(cuò)函數(shù)和重拋出函數(shù)也可以將程序控制轉(zhuǎn)移到合適的 catch 代碼塊。

不歸函數(shù)骇扇、方法可以在 guard 語(yǔ)句的 else 字句中調(diào)用摔竿。

你可以重寫一個(gè)不歸方法,但是新的方法必須保持原有的返回類型和沒(méi)有返回的行為少孝。

enum (枚舉聲明)

枚舉聲明有兩種基本形式继低,使用關(guān)鍵字 enum 來(lái)聲明。枚舉聲明體包含零個(gè)或多個(gè)值稍走,稱為枚舉用例袁翁,還可包含任意數(shù)量的聲明冷溃,包括計(jì)算型屬性、實(shí)例方法梦裂、類型方法似枕、構(gòu)造器、類型別名年柠,甚至其他枚舉凿歼、結(jié)構(gòu)體、類和 actor冗恨。枚舉聲明不能包含析構(gòu)器或者協(xié)議聲明答憔。
枚舉類型可以采納任意數(shù)量的協(xié)議,但是枚舉不能從類掀抹、結(jié)構(gòu)體和其他枚舉繼承虐拓。
不同于類或者結(jié)構(gòu)體,枚舉類型并不隱式提供默認(rèn)構(gòu)造器傲武,所有構(gòu)造器必須顯式聲明蓉驹。一個(gè)構(gòu)造器可以委托給枚舉中的其他構(gòu)造器,但是構(gòu)造過(guò)程僅當(dāng)構(gòu)造器將一個(gè)枚舉用例賦值給 self 后才算完成揪利。

struct (結(jié)構(gòu)體聲明)

使用結(jié)構(gòu)體聲明(structure declaration) 可以在程序中引入一個(gè)結(jié)構(gòu)體類型态兴。結(jié)構(gòu)體聲明使用 struct 關(guān)鍵字,遵循如下的形式:

struct 結(jié)構(gòu)體名稱: 采納的協(xié)議 {
    多條聲明
}

結(jié)構(gòu)體內(nèi)可包含零個(gè)或多個(gè)聲明疟位。這些聲明可以包括存儲(chǔ)型和計(jì)算型屬性瞻润、類型屬性、實(shí)例方法甜刻、類型方法绍撞、構(gòu)造器、下標(biāo)得院、類型別名傻铣,甚至其他結(jié)構(gòu)體、類尿招、actor 和枚舉聲明矾柜。結(jié)構(gòu)體聲明不能包含析構(gòu)器或者協(xié)議聲明。

class (類聲明)

可以在程序中使用類聲明(class declaration) 來(lái)引入一個(gè)類就谜。類聲明使用關(guān)鍵字 class怪蔑,遵循如下的形式:

class 類名: 超類, 采納的協(xié)議 {
    多條聲明
}

類內(nèi)可以包含零個(gè)或多個(gè)聲明。這些聲明可以包括存儲(chǔ)型和計(jì)算型屬性丧荐、實(shí)例方法缆瓣、類型方法、構(gòu)造器虹统、唯一的析構(gòu)器弓坞、下標(biāo)隧甚、類型別名,甚至其他類渡冻、結(jié)構(gòu)體戚扳、actor 和枚舉聲明。類聲明不能包含協(xié)議聲明族吻。

actor (Actor 聲明)

可以在程序中使用 actor 聲明(actor declaration) 來(lái)引入一個(gè) actor帽借。Actor 聲明使用關(guān)鍵字 actor,遵循如下的形式:

actor 名稱: 遵循的協(xié)議 {
    多條聲明
}

Actor 內(nèi)可包含零個(gè)或多個(gè)聲明超歌。這些聲明包括存儲(chǔ)屬性和計(jì)算屬性砍艾、實(shí)例方法、類型方法巍举、構(gòu)造器脆荷、唯一的析構(gòu)器、下標(biāo)懊悯、類型別名蜓谋,甚至其他類、結(jié)構(gòu)體和枚舉聲明定枷。

protocol (協(xié)議聲明)

協(xié)議聲明(protocol declaration) 可以為程序引入一個(gè)命名的協(xié)議類型孤澎。協(xié)議聲明只能在全局區(qū)域使用 protocol 關(guān)鍵字來(lái)進(jìn)行聲明,并遵循如下形式:

protocol 協(xié)議名稱: 繼承的協(xié)議 {
    協(xié)議成員聲明
}

協(xié)議的主體包含零個(gè)或多個(gè)協(xié)議成員聲明欠窒,這些成員描述了任何采納該協(xié)議的類型必須滿足的一致性要求。一個(gè)協(xié)議可以聲明采納者必須實(shí)現(xiàn)的某些屬性退子、方法岖妄、構(gòu)造器以及下標(biāo)。協(xié)議也可以聲明各種各樣的類型別名寂祥,叫做關(guān)聯(lián)類型荐虐,它可以指定協(xié)議的不同聲明之間的關(guān)系。協(xié)議聲明不能包括類丸凭、結(jié)構(gòu)體福扬、枚舉或者其它協(xié)議的聲明。

associatedtype (協(xié)議關(guān)聯(lián)類型聲明)

使用關(guān)鍵字 associatedtype 來(lái)聲明協(xié)議關(guān)聯(lián)類型惜犀。關(guān)聯(lián)類型為作為協(xié)議聲明的一部分铛碑,為某種類型提供了一個(gè)別名。關(guān)聯(lián)類型和泛型參數(shù)子句中的類型參數(shù)很相似虽界,但是它們和 Self 一樣汽烦,用于協(xié)議中。Self 指代采納協(xié)議的類型莉御。

subscript (下標(biāo)聲明)

下標(biāo)聲明(subscript declaration) 用于為特定類型的對(duì)象添加下標(biāo)支持撇吞,通常也用于為訪問(wèn)集合俗冻、列表和序列中的元素提供語(yǔ)法便利。下標(biāo)聲明使用關(guān)鍵字 subscript牍颈,形式如下:

subscript (參數(shù)列表) -> 返回類型 {
    get {
        語(yǔ)句
    }
    set(setter 名稱) {
        語(yǔ)句
    }
}

下標(biāo)聲明只能出現(xiàn)在類迄薄、結(jié)構(gòu)體、枚舉煮岁、擴(kuò)展和協(xié)議的聲明中讥蔽。

init (構(gòu)造器聲明)

構(gòu)造器聲明會(huì)為程序中的類、結(jié)構(gòu)體或枚舉引入構(gòu)造器人乓。構(gòu)造器使用關(guān)鍵字 init 來(lái)聲明勤篮,有兩種基本形式。
結(jié)構(gòu)體色罚、枚舉碰缔、類可以有任意數(shù)量的構(gòu)造器,但是類的構(gòu)造器具有不同的規(guī)則和行為戳护。不同于結(jié)構(gòu)體和枚舉金抡,類有兩種構(gòu)造器,即指定構(gòu)造器和便利構(gòu)造器.

convenience (便利構(gòu)造器)

便利構(gòu)造器可以將構(gòu)造過(guò)程委托給另一個(gè)便利構(gòu)造器或一個(gè)指定構(gòu)造器腌且。但是梗肝,類的構(gòu)造過(guò)程必須以一個(gè)將類中所有屬性完全初始化的指定構(gòu)造器的調(diào)用作為結(jié)束。便利構(gòu)造器不能調(diào)用超類的構(gòu)造器铺董。

required (子類必須實(shí)現(xiàn))

可以使用 required 聲明修飾符巫击,將便利構(gòu)造器和指定構(gòu)造器標(biāo)記為每個(gè)子類都必須實(shí)現(xiàn)的構(gòu)造器。這種構(gòu)造器的子類實(shí)現(xiàn)也必須使用 required 聲明修飾符標(biāo)記精续。
默認(rèn)情況下坝锰,超類中的構(gòu)造器不會(huì)被子類繼承。但是重付,如果子類的所有存儲(chǔ)型屬性都有默認(rèn)值顷级,而且子類自身沒(méi)有定義任何構(gòu)造器,它將繼承超類的構(gòu)造器确垫。如果子類重寫了超類的所有指定構(gòu)造器弓颈,子類將繼承超類的所有便利構(gòu)造器。
和方法删掀、屬性和下標(biāo)一樣翔冀,需要使用 override 聲明修飾符標(biāo)記重寫的指定構(gòu)造器。

注意
如果使用 required 聲明修飾符標(biāo)記一個(gè)構(gòu)造器爬迟,在子類中重寫這種構(gòu)造器時(shí)橘蜜,無(wú)需使用 override 修飾符。

就像函數(shù)和方法,構(gòu)造器也可以拋出或者重拋錯(cuò)誤计福,你可以在構(gòu)造器參數(shù)列表的圓括號(hào)之后使用 throws 或 rethrows 關(guān)鍵字來(lái)表明相應(yīng)的拋出行為跌捆。

init? (可失敗構(gòu)造器)

可失敗構(gòu)造器可以生成所屬類型的可選實(shí)例或者隱式解包可選實(shí)例,因此象颖,這種構(gòu)造器通過(guò)返回 nil 來(lái)指明構(gòu)造過(guò)程失敗佩厚。
聲明生成可選實(shí)例的可失敗構(gòu)造器時(shí),在構(gòu)造器聲明的 init 關(guān)鍵字后加追加一個(gè)問(wèn)號(hào)(init?)说订。聲明生成隱式解包可選實(shí)例的可失敗構(gòu)造器時(shí)抄瓦,在構(gòu)造器聲明后追加一個(gè)嘆號(hào)(init!)。

deinit (析構(gòu)器聲明)

析構(gòu)器聲明(deinitializer declaration) 可以為類聲明一個(gè)析構(gòu)器陶冷。析構(gòu)器沒(méi)有參數(shù)钙姊,遵循如下格式:

deinit {
    語(yǔ)句
}

當(dāng)沒(méi)有任何強(qiáng)引用引用著類的對(duì)象,對(duì)象即將被釋放時(shí)埂伦,析構(gòu)器會(huì)被自動(dòng)調(diào)用煞额。析構(gòu)器只能在類主體的聲明中聲明,不能在類的擴(kuò)展聲明中聲明沾谜,并且每個(gè)類最多只能有一個(gè)析構(gòu)器膊毁。
子類會(huì)繼承超類的析構(gòu)器,并會(huì)在子類對(duì)象將要被釋放時(shí)隱式調(diào)用基跑。繼承鏈上的所有析構(gòu)器全部調(diào)用完畢后子類對(duì)象才會(huì)被釋放婚温。
析構(gòu)器不能直接調(diào)用。

extension (擴(kuò)展聲明)

擴(kuò)展聲明(extension declaration) 可以擴(kuò)展一個(gè)現(xiàn)存的類型的行為媳否。
擴(kuò)展聲明使用關(guān)鍵字 extension栅螟,遵循如下格式:

extension 類型名稱 where 要求 {
    聲明語(yǔ)句
}

擴(kuò)展聲明可以為一個(gè)現(xiàn)有的類、結(jié)構(gòu)體或者枚舉類型添加協(xié)議遵循:

extension 類型名稱: 采納的協(xié)議 where 約束條件 {
    多條聲明
}

operator (運(yùn)算符聲明)

運(yùn)算符聲明(operator declaration) 會(huì)向程序中引入中綴篱竭、前綴或后綴運(yùn)算符嵌巷,使用關(guān)鍵字 operator 來(lái)聲明。

可以聲明三種不同的綴性:中綴室抽、前綴和后綴。運(yùn)算符的綴性指定了運(yùn)算符與其運(yùn)算對(duì)象的相對(duì)位置靡努。

運(yùn)算符聲明有三種基本形式坪圾,每種綴性各一種。運(yùn)算符的綴性通過(guò)在 operator 關(guān)鍵字之前添加聲明修飾符 infix惑朦,prefixpostfix 來(lái)指定兽泄。每種形式中,運(yùn)算符的名字只能包含 運(yùn)算符 中定義的運(yùn)算符字符漾月。

  1. 下面的形式聲明了一個(gè)新的中綴運(yùn)算符:
infix operator 運(yùn)算符名稱: 優(yōu)先級(jí)組

中綴運(yùn)算符是二元運(yùn)算符病梢,置于兩個(gè)運(yùn)算對(duì)象之間,例如加法運(yùn)算符(+)位于表達(dá)式 1 + 2 的中間。

中綴運(yùn)算符可以選擇指定優(yōu)先級(jí)組蜓陌。如果沒(méi)有為運(yùn)算符設(shè)置優(yōu)先級(jí)組觅彰,Swift 會(huì)設(shè)置默認(rèn)優(yōu)先級(jí)組 DefaultPrecedence,它的優(yōu)先級(jí)比三目?jī)?yōu)先級(jí) TernaryPrecedence 要高,更多內(nèi)容參考優(yōu)先級(jí)組聲明

  1. 下面的形式聲明了一個(gè)新的前綴運(yùn)算符:
prefix operator 運(yùn)算符名稱

出現(xiàn)在運(yùn)算對(duì)象前邊的前綴運(yùn)算符是一元運(yùn)算符钮热,例如表達(dá)式 !a 中的前綴非運(yùn)算符(!)填抬。

前綴運(yùn)算符的聲明中不指定優(yōu)先級(jí),而且前綴運(yùn)算符是非結(jié)合的隧期。

  1. 下面的形式聲明了一個(gè)新的后綴運(yùn)算符:
postfix operator 運(yùn)算符名稱

緊跟在運(yùn)算對(duì)象后邊的后綴運(yùn)算符是一元運(yùn)算符飒责,例如表達(dá)式 a! 中的后綴強(qiáng)制解包運(yùn)算符(!)。
和前綴運(yùn)算符一樣仆潮,后綴運(yùn)算符的聲明中不指定優(yōu)先級(jí)宏蛉,而且后綴運(yùn)算符是非結(jié)合的。
聲明了一個(gè)新的運(yùn)算符以后性置,需要實(shí)現(xiàn)一個(gè)跟這個(gè)運(yùn)算符同名的函數(shù)來(lái)實(shí)現(xiàn)這個(gè)運(yùn)算符拾并。如果是實(shí)現(xiàn)一個(gè)前綴或者后綴運(yùn)算符,也必須使用相符的 prefix 或者 postfix 聲明修飾符標(biāo)記函數(shù)聲明蚌讼。如果是實(shí)現(xiàn)中綴運(yùn)算符辟灰,則不需要使用 infix 聲明修飾符標(biāo)記函數(shù)聲明。

優(yōu)先級(jí)組聲明

優(yōu)先級(jí)組聲明(A precedence group declaration) 會(huì)向程序的中綴運(yùn)算符引入一個(gè)全新的優(yōu)先級(jí)組篡石。當(dāng)沒(méi)有用圓括號(hào)分組時(shí)芥喇,運(yùn)算符優(yōu)先級(jí)反應(yīng)了運(yùn)算符與它的操作數(shù)的關(guān)系的緊密程度。 優(yōu)先級(jí)組的聲明如下所示:

precedencegroup 優(yōu)先級(jí)組名稱{
    higherThan: 較低優(yōu)先級(jí)組的名稱
    lowerThan: 較高優(yōu)先級(jí)組的名稱
    associativity: 結(jié)合性
    assignment: 賦值性
}

較低優(yōu)先級(jí)組和較高優(yōu)先級(jí)組的名稱說(shuō)明了新建的優(yōu)先級(jí)組是依賴于現(xiàn)存的優(yōu)先級(jí)組的凰萨。

聲明修飾符

聲明修飾符都是關(guān)鍵字或上下文相關(guān)的關(guān)鍵字继控,可以修改一個(gè)聲明的行為或者含義∨志欤可以在聲明的特性(如果存在)和引入該聲明的關(guān)鍵字之間武通,利用聲明修飾符的關(guān)鍵字或上下文相關(guān)的關(guān)鍵字指定一個(gè)聲明修飾符。

class
該修飾符用于修飾任何類成員珊搀,表明是類自身的成員冶忱,而不是類實(shí)例的成員。父類中使用該修飾符標(biāo)記或者未被 final 修飾符標(biāo)記的成員境析,都允許被子類重寫囚枪。

dynamic
該修飾符用于修飾任何兼容 Objective-C 的類的成員。訪問(wèn)被 dynamic 修飾符標(biāo)記的類成員將總是由 Objective-C 運(yùn)行時(shí)系統(tǒng)進(jìn)行動(dòng)態(tài)派發(fā)劳淆,而不會(huì)由編譯器進(jìn)行內(nèi)聯(lián)或消虛擬化链沼。

因?yàn)楸粯?biāo)記 dynamic 修飾符的類成員會(huì)由 Objective-C 運(yùn)行時(shí)系統(tǒng)進(jìn)行動(dòng)態(tài)派發(fā),所以它們會(huì)被隱式標(biāo)記 objc 特性沛鸵。

final
該修飾符用于修飾類或類中的屬性括勺、方法以及下標(biāo)。如果用它修飾一個(gè)類,那么這個(gè)類不能被繼承疾捍。如果用它修飾類中的屬性奈辰、方法或下標(biāo),那么它們不能在子類中被重寫拾氓。

lazy
該修飾符用于修飾類或結(jié)構(gòu)體中的存儲(chǔ)型變量屬性冯挎,表示該屬性的初始值最多只被計(jì)算和存儲(chǔ)一次,且發(fā)生在它被第一次訪問(wèn)時(shí)咙鞍。關(guān)于如何使用 lazy 修飾符的例子房官,請(qǐng)參閱 惰性存儲(chǔ)型屬性。

optional
該修飾符用于修飾協(xié)議中的屬性续滋、方法以及下標(biāo)成員翰守,表示符合類型可以不實(shí)現(xiàn)這些成員要求。

只能將 optional 修飾符用于被 objc 特性標(biāo)記的協(xié)議疲酌。這樣一來(lái)蜡峰,就只有類類型可以采納并符合擁有可選成員要求的協(xié)議。關(guān)于如何使用 optional 修飾符朗恳,以及如何訪問(wèn)可選協(xié)議成員(比如湿颅,不確定符合類型是否已經(jīng)實(shí)現(xiàn)了這些可選成員)的信息,請(qǐng)參閱 可選協(xié)議要求粥诫。

required
該修飾符用于修飾類的指定構(gòu)造器或便利構(gòu)造器油航,表示該類所有的子類都必須實(shí)現(xiàn)該構(gòu)造器。在子類實(shí)現(xiàn)該構(gòu)造器時(shí)怀浆,必須同樣使用 required 修飾符修飾該構(gòu)造器谊囚。

static
該修飾符用于修飾結(jié)構(gòu)體、類执赡、枚舉或協(xié)議的成員镰踏,表明是類型成員,而不是類型實(shí)例的成員沙合。在類聲明的作用范圍內(nèi)奠伪,使用 static 修飾符標(biāo)記成員聲明語(yǔ)句,同 classfinal 修飾符具有相同的效果首懈。但是類的常量類型屬性是一個(gè)例外: static 沒(méi)有問(wèn)題芳来,但是你無(wú)法為常量聲明使用 classfinal 修飾符。

unowned
該修飾符用于修飾存儲(chǔ)型變量猜拾、常量或者存儲(chǔ)型變量屬性,表示該變量或?qū)傩猿钟衅浯鎯?chǔ)對(duì)象的無(wú)主引用佣盒。如果在此存儲(chǔ)對(duì)象釋放后嘗試訪問(wèn)該對(duì)象挎袜,會(huì)引發(fā)運(yùn)行時(shí)錯(cuò)誤。如同弱引用一樣,該引用類型的變量或?qū)傩员仨毷穷愵愋投⒁恰Ec弱引用不同的是紊搪,這種類型的變量或?qū)傩允欠强蛇x的。關(guān)于 unowned 更多的信息和例子全景,請(qǐng)參閱 無(wú)主引用

unowned(safe)

unowned 的顯式寫法

unowned(unsafe)

該修飾符用于修飾存儲(chǔ)型變量耀石、常量或者存儲(chǔ)型變量屬性,表示該變量或?qū)傩猿钟衅浯鎯?chǔ)對(duì)象的無(wú)主引用爸黄。如果在此存儲(chǔ)對(duì)象釋放后嘗試訪問(wèn)該對(duì)象滞伟,會(huì)直接訪問(wèn)該對(duì)象釋放前存儲(chǔ)的內(nèi)存地址,因此這是非內(nèi)存安全的操作炕贵。如同弱引用一樣梆奈,該引用類型的變量或?qū)傩员仨毷穷愵愋汀Ec弱引用不同的是称开,這種類型的變量或?qū)傩允欠强蛇x的亩钟。關(guān)于 unowned 更多的信息和例子,請(qǐng)參閱 無(wú)主引用鳖轰。

weak
該修飾符用于修飾變量或存儲(chǔ)型變量屬性清酥,表示該變量或?qū)傩猿钟衅浯鎯?chǔ)的對(duì)象的弱引用。這種變量或?qū)傩缘念愋捅仨毷强蛇x的類類型蕴侣。使用 weak 修飾符可避免強(qiáng)引用循環(huán)焰轻。關(guān)于 weak 修飾符的更多信息和例子,請(qǐng)參閱 弱引用睛蛛。

訪問(wèn)控制級(jí)別

Swift 提供了五個(gè)級(jí)別的訪問(wèn)控制:open鹦马、publicinternal忆肾、file privateprivate荸频。可以使用以下任意一種訪問(wèn)級(jí)別修飾符來(lái)指定聲明的訪問(wèn)級(jí)別客冈。訪問(wèn)控制在 訪問(wèn)控制 中有詳細(xì)討論旭从。

open
該修飾符表示聲明可被同模塊的代碼訪問(wèn),且可作為基類使用场仲,只要其他模塊導(dǎo)入了聲明所在的模塊和悦,也可以進(jìn)行訪問(wèn),且可作為基類使用渠缕。

public
該修飾符表示聲明可被同模塊的代碼訪問(wèn)鸽素,且可作為基類使用,只要其他模塊導(dǎo)入了聲明所在的模塊亦鳞,也可以進(jìn)行訪問(wèn)馍忽,但不可作為基類使用棒坏。

internal
該修飾符表示聲明只能被同模塊的代碼訪問(wèn)。默認(rèn)情況下遭笋,絕大多數(shù)聲明會(huì)被隱式標(biāo)記 internal 訪問(wèn)級(jí)別修飾符坝冕。

fileprivate
該修飾符表示聲明只能被所在源文件的代碼訪問(wèn)。

private
該修飾符表示聲明只能被聲明所直接包含的作用域內(nèi)的代碼訪問(wèn)瓦呼。

為了達(dá)到訪問(wèn)控制的目的喂窟,同一文件中相同類型的擴(kuò)展共享訪問(wèn)控制作用域。如果這些擴(kuò)展與它們擴(kuò)展的類型也在同一個(gè)文件中央串,則這些擴(kuò)展共享該類型的訪問(wèn)控制作用域磨澡。在類型聲明中聲明的私有成員可以從擴(kuò)展中訪問(wèn),在某個(gè)擴(kuò)展中聲明的私有成員可以從其他擴(kuò)展和類型聲明中訪問(wèn)蹋辅。

dynamicMemberLookup

該特性用于類钱贯、結(jié)構(gòu)體、枚舉或協(xié)議侦另,讓其能在運(yùn)行時(shí)查找成員秩命。該類型必須實(shí)現(xiàn) subscript(dynamicMember:) 下標(biāo)。

discardableResult

該特性用于的函數(shù)或方法聲明褒傅,以抑制編譯器中函數(shù)或方法被調(diào)用而其返回值沒(méi)有被使用時(shí)的警告弃锐。

dynamicCallable

該特性用于類、結(jié)構(gòu)體殿托、枚舉或協(xié)議霹菊,以將該類型的實(shí)例視為可調(diào)用的函數(shù)。該類型必須實(shí)現(xiàn) dynamicallyCall(withArguments:)支竹、dynamicallyCall(withKeywordArguments:) 方法之一旋廷,或兩者同時(shí)實(shí)現(xiàn)。

inlinable

該特性用于函數(shù)礼搁、方法饶碘、計(jì)算屬性、下標(biāo)馒吴、便利構(gòu)造器或析構(gòu)器的聲明扎运,以將該聲明的實(shí)現(xiàn)公開(kāi)為模塊公開(kāi)接口的一部分。編譯器允許在調(diào)用處把 inlinable 標(biāo)記的符號(hào)替換為符號(hào)實(shí)現(xiàn)的副本饮戳。

main

將該特性用于結(jié)構(gòu)體豪治、類,或枚舉的聲明扯罐,表示它包含了程序流的頂級(jí)入口负拟。類型必須提供一個(gè)不接收任何參數(shù),且返回值為 Void 的 main 類型函數(shù)歹河。

nonobjc

針對(duì)方法齿椅、屬性琉挖、下標(biāo)、或構(gòu)造器的聲明使用該特性將覆蓋隱式的 objc 特性涣脚。nonobjc 特性告訴編譯器該聲明不能在 Objective-C 代碼中使用,即便它能在 Objective-C 中表示寥茫。

NSApplicationMain

在類上使用該特性表示該類是應(yīng)用程序委托類遣蚀。使用該特性與調(diào)用 NSApplicationMain(::) 函數(shù)的效果相同。

NSCopying

該特性用于修飾一個(gè)類的存儲(chǔ)型變量屬性纱耻。該特性將使屬性的設(shè)值方法使用傳入值的副本進(jìn)行賦值芭梯,這個(gè)值由傳入值的 copyWithZone(_:) 方法返回,而不是傳入值本身弄喘。該屬性的類型必需符合 NSCopying 協(xié)議玖喘。
NSCopying 特性的行為與 Objective-C 中的 copy 屬性特性相似。

NSManaged

該特性用于修飾 NSManagedObject 子類中的實(shí)例方法或存儲(chǔ)型變量屬性蘑志,表明它們的實(shí)現(xiàn)由 Core Data 在運(yùn)行時(shí)基于相關(guān)實(shí)體描述動(dòng)態(tài)提供累奈。對(duì)于標(biāo)記了 NSManaged 特性的屬性,Core Data 也會(huì)在運(yùn)行時(shí)為其提供存儲(chǔ)急但。應(yīng)用這個(gè)特性也意味著 objc 特性澎媒。

objc

該特性用于修飾任何可以在 Objective-C 中表示的聲明。比如波桩,非嵌套類戒努、協(xié)議、非泛型枚舉(僅限原始值為整型的枚舉)镐躲、類的屬性和方法(包括存取方法)储玫、協(xié)議以及協(xié)議中的可選成員、構(gòu)造器以及下標(biāo)運(yùn)算符萤皂。objc 特性告訴編譯器這個(gè)聲明可以在 Objective-C 代碼中使用撒穷。
該特性用在擴(kuò)展中,與在沒(méi)有明確標(biāo)記為 nonobjc 特性的擴(kuò)展中給每個(gè)成員添加該特性具有相同效果敌蚜。

objcMembers

該特性用于類聲明桥滨,以將 objc 特性應(yīng)用于該類、擴(kuò)展弛车、子類以及子類的擴(kuò)展的所有 Objective-C 兼容成員齐媒。
大多數(shù)代碼應(yīng)該使用 objc 特性,以暴露所需的聲明纷跛。如果需要暴露多個(gè)聲明喻括,可以將其分組到添加 objc 特性的擴(kuò)展中。objcMembers 特性為大量使用 Objective-C 運(yùn)行時(shí)的內(nèi)省工具的庫(kù)提供了便利贫奠。添加不必要的 objc 特性會(huì)增加二進(jìn)制體積并影響性能唬血。

propertyWrapper

在類望蜡、結(jié)構(gòu)體或者枚舉的聲明時(shí)使用該特性,可以讓其成為一個(gè)屬性包裝器拷恨。如果將該特性應(yīng)用在一個(gè)類型上脖律,將會(huì)創(chuàng)建一個(gè)與該類型同名的自定義特性。將這個(gè)新的特性用于類腕侄、結(jié)構(gòu)體小泉、枚舉的屬性,則可以通過(guò)包裝器的實(shí)例封裝對(duì)該屬性的訪問(wèn)冕杠;本地存儲(chǔ)變量聲明也能利用這個(gè)特性完成對(duì)它的訪問(wèn)封裝微姊。局部和全局變量不能使用屬性包裝器。

resultBuilder

將該特性應(yīng)用于類分预、結(jié)構(gòu)體或者枚舉兢交,可以把它作為結(jié)果構(gòu)造器使用。結(jié)果構(gòu)造器能按順序構(gòu)造一組嵌套的數(shù)據(jù)結(jié)構(gòu)笼痹。利用它配喳,可以以一種自然的聲明式語(yǔ)法為嵌套數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)一套領(lǐng)域?qū)iT語(yǔ)言(DSL)。

requires_stored_property_inits

該特性用于類聲明与倡,以要求類中所有存儲(chǔ)屬性提供默認(rèn)值作為其定義的一部分界逛。對(duì)于從中繼承的任何類都推斷出 NSManagedObject 特性。

testable

將此特性應(yīng)用于 import 聲明以導(dǎo)入該模塊纺座,并更改其訪問(wèn)控制以簡(jiǎn)化對(duì)該模塊代碼的測(cè)試息拜。這樣就能訪問(wèn)被導(dǎo)入模塊中的任何標(biāo)有 internal 訪問(wèn)級(jí)別修飾符的實(shí)體,猶如它們被標(biāo)記了 public 訪問(wèn)級(jí)別修飾符净响。測(cè)試也可以訪問(wèn)使用 internal 或者 public 訪問(wèn)級(jí)別修飾符標(biāo)記的類和類成員少欺,就像它們是 open 訪問(wèn)修飾符聲明的。被導(dǎo)入的模塊必須以允許測(cè)試的方式編譯馋贤。

UIApplicationMain

在類上使用該特性表示該類是應(yīng)用程序委托類赞别。使用該特性與調(diào)用 UIApplicationMain 函數(shù)并且把該類的名字作為委托類的名字傳遞給函數(shù)的效果相同。
如果你不想使用這個(gè)特性配乓,可以提供一個(gè) main.swift 文件仿滔,并在代碼頂層調(diào)用 UIApplicationMain(::::) 函數(shù)。比如犹芹,如果你的應(yīng)用程序使用一個(gè)繼承于 UIApplication 的自定義子類作為主要類崎页,你可以調(diào)用 UIApplicationMain(::::) 函數(shù)而不是使用該特性。

usableFromInline

該特性用于函數(shù)腰埂、方法飒焦、計(jì)算屬性、下標(biāo)屿笼、構(gòu)造器或析構(gòu)器的聲明牺荠,以在同一模塊中允許該符號(hào)用于內(nèi)聯(lián)代碼的聲明翁巍。聲明必須具有 internal 訪問(wèn)級(jí)別修飾符。被標(biāo)記為 usableFromInline 的結(jié)構(gòu)體或類它們屬性的類型只能是被標(biāo)記為 public 或者 usableFromInline 的類型休雌。被標(biāo)記為 usableFromInline 的枚舉灶壶,它 case 的真實(shí)值或者關(guān)聯(lián)類型只能是被標(biāo)記為 public 或者 usableFromInline 的類型。

warn-unqualified-access

該特性應(yīng)用于頂級(jí)函數(shù)杈曲、實(shí)例方法例朱、類方法或靜態(tài)方法,以在沒(méi)有前置限定符(例如模塊名稱鱼蝉、類型名稱、實(shí)例變量或常量)的情況下使用該函數(shù)或方法時(shí)觸發(fā)警告箫荡。使用該特性可以減少在同一作用域里訪問(wèn)的同名函數(shù)之間的歧義魁亦。

Interface Builder 使用的聲明特性

Interface Builder 特性是 Interface Builder 用來(lái)與 Xcode 同步的聲明特性。Swift 提供了以下的 Interface Builder 特性:IBAction羔挡,IBSegueAction洁奈,IBOutlet,IBDesignable绞灼,以及 IBInspectable利术。這些特性與 Objective-C 中對(duì)應(yīng)的特性在概念上是相同的。
IBOutlet 和 IBInspectable 用于修飾一個(gè)類的屬性聲明低矮。IBAction 和 IBSegueAction 特性用于修飾一個(gè)類的方法聲明印叁,IBDesignable 用于修飾類的聲明。
應(yīng)用 IBAction军掂、IBSegueAction轮蜕、IBOutlet、IBDesignable 或者 IBInspectable 特性都意味著同時(shí)應(yīng)用 objc 特性蝗锥。

autoclosure

這個(gè)特性通過(guò)把表達(dá)式自動(dòng)封裝成無(wú)參數(shù)的閉包來(lái)延遲表達(dá)式的計(jì)算跃洛。它可以修飾類型為返回表達(dá)式結(jié)果類型的無(wú)參數(shù)函數(shù)類型的函數(shù)參數(shù)。

convention

該特性用于修飾函數(shù)類型终议,它指出了函數(shù)調(diào)用的約定汇竭。
convention 特性總是與下面的參數(shù)之一一起出現(xiàn)。
swift 參數(shù)用于表示一個(gè) Swift 函數(shù)引用穴张。這是 Swift 中函數(shù)值的標(biāo)準(zhǔn)調(diào)用約定细燎。
block 參數(shù)用于表示一個(gè) Objective-C 兼容的塊引用。函數(shù)值會(huì)作為一個(gè)塊對(duì)象的引用陆馁,塊是一種 id 兼容的 Objective-C 對(duì)象找颓,其中嵌入了調(diào)用函數(shù)。調(diào)用函數(shù)使用 C 的調(diào)用約定叮贩。
c 參數(shù)用于表示一個(gè) C 函數(shù)引用击狮。函數(shù)值沒(méi)有上下文佛析,不具備捕獲功能,并且使用 C 的調(diào)用約定彪蓬。
除了少數(shù)例外寸莫,當(dāng)函數(shù)需要任何其他調(diào)用約定時(shí),可以轉(zhuǎn)換成任意調(diào)用約定的函數(shù)档冬。非范型全局函數(shù)勾习、不捕獲任何局部變量的局部函數(shù)或不捕獲任何局部變量的閉包可以轉(zhuǎn)換為 C 調(diào)用約定。其余的 Swift 函數(shù)不能轉(zhuǎn)換成 C 調(diào)用約定弄砍。一個(gè) Objective-C 塊調(diào)用約定的函數(shù)不能轉(zhuǎn)換成 C 調(diào)用約定原献。

escaping

在函數(shù)或者方法聲明上使用該特性,它表示參數(shù)將不會(huì)被存儲(chǔ)以供延遲執(zhí)行盐数。這將確保參數(shù)不會(huì)超出函數(shù)調(diào)用的生命周期棒拂。在使用 escaping 特性聲明的函數(shù)類型中訪問(wèn)屬性和方法時(shí)需要顯式地使用 self.

unknown

該特性用于 switch case玫氢,用于沒(méi)有匹配上代碼編譯時(shí)已知 case 的情況帚屉。有關(guān)如何使用 unknown 特性的示例,可參閱 對(duì)未來(lái)枚舉的 case 進(jìn)行 switch漾峡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攻旦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子生逸,更是在濱河造成了極大的恐慌牢屋,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牺陶,死亡現(xiàn)場(chǎng)離奇詭異伟阔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)掰伸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門皱炉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人狮鸭,你說(shuō)我怎么就攤上這事合搅。” “怎么了歧蕉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵灾部,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我惯退,道長(zhǎng)赌髓,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮锁蠕,結(jié)果婚禮上夷野,老公的妹妹穿的比我還像新娘。我一直安慰自己荣倾,他們只是感情好悯搔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著舌仍,像睡著了一般妒貌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铸豁,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天灌曙,我揣著相機(jī)與錄音,去河邊找鬼节芥。 笑死平匈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的藏古。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼忍燥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拧晕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起梅垄,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厂捞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后队丝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體靡馁,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年机久,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了臭墨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膘盖,死狀恐怖胧弛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侠畔,我是刑警寧澤结缚,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站软棺,受9級(jí)特大地震影響红竭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一茵宪、第九天 我趴在偏房一處隱蔽的房頂上張望最冰。 院中可真熱鬧,春花似錦眉厨、人聲如沸锌奴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鹿蜀。三九已至,卻和暖如春服球,著一層夾襖步出監(jiān)牢的瞬間茴恰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工斩熊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留往枣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓粉渠,卻偏偏與公主長(zhǎng)得像分冈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霸株,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容