Swift中的訪問控制和protected

2022-09-21 08:57:09 字數 1284 閱讀 4010

原文再續,書折第一回。

很多其他程式語言都有一種」protected「設定,可以限制某些類方法只能被它的子類所使用。

swift支援了訪問控制後,大家給我們的反饋都很不錯。而有的開發者問我們:「為什麼swift沒有類似protected的選項?」

當我們在設計swift訪問控制的不同等級時,我們認為有兩種主要場景:

●在乙個app裡:隱藏某個類的私密細節。

●在乙個開源框架裡:不讓匯入這個框架的app,隨便接觸框架的內部實現細節。

上面的兩種常見情況,對應著private和internal這兩個等級。

而protected相當於把訪問控制和繼承特性混在一起,把訪問控制的等級設定增加了乙個維度,使之複雜化。即使設定了protected,子類還是可以通過新的公開方法、新的屬性來接觸到所謂「protected」了的api。另一方面,我們可以在各種地方重寫乙個方法,所謂的保護卻沒有提供優化機制。這種設定往往在做不必要的限制 一 protected允許了子類,但又禁止所有其他別的類(包括那些幫助子類實現某些功能的類)接觸父類的成員程式設計客棧。

有的開發者指出,apple的框架有時候也會把給子類用的api分隔出來。這時候protected不就有用了嗎?我們研究後www.cppcns.com發現,這些方法一般屬於下面兩種情況:一是這些方法對子類以外的類沒啥用,所以不需要嚴格保護(例如上面說的協助實現某些功能的類)。二是這些方法就是設計出來被重寫,而不是直接用的。舉個例子,drawrect(_:)就是在uikit基礎上使用的方法,但它不能在uikit以外應用。

除此之外,如果有了protected,它要怎麼樣和extension相互作用dhyym呢?乙個類的extension能接觸它的protected成員嗎?乙個子類的extension可以接觸父類的protected成員嗎?extension宣告的位置對訪問控制等級有沒有影響呢?(複雜到要哭了是不是?)

對訪問控制dhyym的設計,也依循了objective-c開發者(包括apple內外的)的常規做法。objective-c方法和屬性一般在.h標頭檔案裡宣告,但也可以寫在.m實現檔案裡。假如有乙個公開的類,想把裡面某些部分設為只有框架內可以獲取時,開發者一般會建立另乙個標頭檔案給內部使用。以上三種訪問級別,就對應了swift裡面的public,private和internal。

swift的訪問控制等級和繼承無關,是單維度、非常清楚明了的。我們認為這樣的模式更簡潔,同時滿足了最主要的需求:將乙個類、或乙個框架的實現細節隔離保護起來。這可能和你以前用過的不同,但我們鼓勵你試試看。

本文標題: swift中的訪問控制和protected

本文位址: /ruanjian/swift/125276.html

Swift 中的訪問控制

訪問許可權範圍依次為 private fileprivate internal public open private 訪問級別所修飾的屬性或者方法只能在當前類裡訪問。fileprivate 訪問級別所修飾的屬性或者方法在當前的 swift 原始檔裡可以訪問。public 修飾的屬性或方法可以被任何...

Swift 訪問控制

原始檔就是 swift 中的源 檔案,它通常屬於乙個模組,即乙個應用程式或者框架。儘管我們一般會將不同的型別分別定義在不同的原始檔中,但是同乙個原始檔也可以包含多個型別 函式之類的定義。internal 級別讓實體被同一模組原始檔中的任何實體訪問,但是不能被模組外的實體訪問。file private...

swift之訪問控制

1 訪問控制種類 swift3.0以後,訪問控制主要分為五類 open public internal fileprivate private,其中open級別最高,private最低。訪問控制 定義open 可以訪問自己模組中原始檔裡面的任何實體,其他模組也可以通過引入該模組中原始檔訪問所有的實體...