swift 關(guān)鍵字 final

final

關(guān)鍵字可以用在蔫敲,或者前面進(jìn)行修飾添履,表示不允許對該內(nèi)容進(jìn)行繼承或者重寫操作憎乙。這個關(guān)鍵字的作用和C#中的相同票罐,而其實在C#算是一個飽受爭議的關(guān)鍵字。有一派程序員認(rèn)為泞边,類似這樣的禁止繼承和重寫的做法是非常有益的该押,它可以更好地對代碼進(jìn)行版本控制,得到更佳的性能阵谚,以及使代碼更安全蚕礼。因此他們甚至認(rèn)為語言應(yīng)當(dāng)是默認(rèn)不允許繼承的,只有在顯式地指明可以繼承的時候才能子類化梢什。

在寫Swift的時候可能會在什么情況下使用

權(quán)限控制

給一段代碼加上就意味著編譯器向你作出保證奠蹬,這段代碼不會再被修改;同時,這也意味著你認(rèn)為這段代碼已經(jīng)完備并且沒有再被進(jìn)行繼承或重寫的必要嗡午,因此這往往會是一個需要深思熟慮的決定囤躁。在Cocoa開發(fā)中app開發(fā)是一塊很大的內(nèi)容,對于大多數(shù)我們自己完成的面向app開發(fā)代碼,其實不太會提供給別人使用割以,這種情況下即使是將所有自己寫的代碼標(biāo)記為都是一件無可厚非的事情(但我并不是在鼓勵這么做) --因為在需要的任何時候你都可以將這個關(guān)鍵字去掉以恢復(fù)其可繼承性金度。而在開發(fā)給其他開發(fā)者使用的庫時,就必須更深入地考慮各種使用場景和需求了严沥。

一般來說猜极,不希望被繼承和重寫會有這幾種情況:

類或者方法的功能確實已經(jīng)完備了

對于很多的輔助性質(zhì)的工具類或者方法,可能我們會考慮加上消玄。這樣的類有一個比較大的特點跟伏,是很可能只包含類方法而沒有實例方法。比如我們很難想到一種情況需要繼承或重寫一個負(fù)責(zé)計算一段字符串的MD5或者AES加密解密的工具類翩瓜。這種工具類和方法的算法是經(jīng)過完備驗證和固定的受扳,使用者只需要調(diào)用,而相對來說不可能有繼承和重寫的需求兔跌。

這種情況很多時候遵循的是以往經(jīng)驗和主觀判斷勘高,而單個的開發(fā)者的判斷其實往往并不可靠。遇到希望把某個自己開發(fā)的類或者方法標(biāo)為的時候坟桅,去找?guī)讉€富有經(jīng)驗的開發(fā)者华望,問問他們的意見或者看法,應(yīng)該是一個比較靠譜的做法仅乓。

子類繼承和修改是一件危險的事情

在子類繼承或重寫某些方法后可能做一些破壞性的事情赖舟,導(dǎo)致子類或者父類部分也無法正常工作的情況。舉個例子夸楣,在某個公司管理的系統(tǒng)中我們對員工按照一定規(guī)則進(jìn)行編號宾抓,這樣通過編號我們能迅速找到任一員工。而假如我們在子類中重寫了這個編號方法豫喧,很可能就導(dǎo)致基類中的依賴員工編號的方法失效石洗。在這類情況下,將編號方法標(biāo)記為以確保穩(wěn)定紧显,可能是一種更好的做法劲腿。

為了父類中某些代碼一定會被執(zhí)行

有時候父類中有一些關(guān)鍵代碼是在被繼承重寫后必須執(zhí)行的(比如狀態(tài)配置,認(rèn)證等等)鸟妙,否則將導(dǎo)致運行時候的錯誤。而在一般的方法中挥吵,如果子類重寫了父類方法重父,是沒有辦法強(qiáng)制子類方法一定去調(diào)用相同的父類方法的。在Objective-C的時候我們可以通過指定__attribute__((objc_requires_super))這樣的屬性來讓編譯器在子類沒有調(diào)用父類方法時拋出警告忽匈。

在Swift中對原來的很多attribute的支持現(xiàn)在還缺失中房午,為了達(dá)到類似的目的,我們可以使用一個final的方法丹允,在其中進(jìn)行一些必要的配置郭厌,然后再調(diào)用某個需要子類實現(xiàn)的方法袋倔,以確保正常運行:

class ? ?Parent{

? ? ? final fun method() {?

? ? ? ? ? ? ? ? methodImpl()

? ? ? ?}

func methodImpl(){ fatalError("子類必須實現(xiàn)這個方法")}

}

class ?Child: Parent {

override ? func ?methodImpl(){ //..子類的業(yè)務(wù)邏輯}

}

這樣,無論如何我們?nèi)绾问褂谜勰伎梢员WC需要的代碼一定被運行過宾娜,而同時又給了子類繼承和重寫自定義具體實現(xiàn)的機(jī)會。

性能考慮

使用final的另一個重要理由是可能帶來的性能改善扇售。因為編譯器能夠從final中獲取額外的信息前塔,因此可以對類或者方法調(diào)用進(jìn)行額外的優(yōu)化處理。但是這個優(yōu)勢在實際表現(xiàn)中可能帶來的好處其實就算與Objective-C的動態(tài)派發(fā)相比也十分有限邪驮,因此在項目還有其他方面可以優(yōu)化(一般來說會是算法或者圖形相關(guān)的內(nèi)容導(dǎo)致性能瓶頸)的情況下溃列,并不建議使用將類或者方法轉(zhuǎn)為的方式來追求性能的提升暗挑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寂屏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娜搂,老刑警劉巖迁霎,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涌攻,居然都是意外死亡欧引,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門恳谎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芝此,“玉大人,你說我怎么就攤上這事因痛』槠唬” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵鸵膏,是天一觀的道長膊升。 經(jīng)常有香客問我,道長谭企,這世上最難降的妖魔是什么廓译? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮债查,結(jié)果婚禮上非区,老公的妹妹穿的比我還像新娘。我一直安慰自己盹廷,他們只是感情好征绸,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般管怠。 火紅的嫁衣襯著肌膚如雪淆衷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天渤弛,我揣著相機(jī)與錄音祝拯,去河邊找鬼。 笑死暮芭,一個胖子當(dāng)著我的面吹牛鹿驼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辕宏,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼畜晰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瑞筐?” 一聲冷哼從身側(cè)響起凄鼻,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎聚假,沒想到半個月后块蚌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡膘格,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年峭范,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘪贱。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纱控,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菜秦,到底是詐尸還是另有隱情甜害,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布球昨,位于F島的核電站尔店,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏主慰。R本人自食惡果不足惜嚣州,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望共螺。 院中可真熱鬧避诽,春花似錦、人聲如沸璃谨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佳吞。三九已至拱雏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間底扳,已是汗流浹背铸抑。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留衷模,地道東北人鹊汛。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像阱冶,于是被迫代替她去往敵國和親刁憋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法木蹬,類相關(guān)的語法至耻,內(nèi)部類的語法,繼承相關(guān)的語法镊叁,異常的語法尘颓,線程的語...
    子非魚_t_閱讀 31,630評論 18 399
  • 一:java概述:1,JDK:Java Development Kit晦譬,java的開發(fā)和運行環(huán)境疤苹,java的開發(fā)工...
    ZaneInTheSun閱讀 2,650評論 0 11
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,104評論 25 707
  • 文/一葉苦艾 1、 老林今年四十歲敛腌,瘦高個卧土,頭發(fā)稀少,臉上皮膚有兩種顏色迎瞧,鼻尖以上慘白夸溶,以下緋紅,乍一看酷似京劇臉...
    一葉苦艾閱讀 2,228評論 19 16
  • 1.1 什么是批處理凶硅? 從內(nèi)容上看缝裁,批處理文件包含了大量的基本DOS命令,是一種可執(zhí)行文件足绅。該文件運行時能按照其規(guī)...
    東飛閱讀 4,053評論 1 4