1>模塊和源文件
Swift 中的訪問控制模型基于模塊和源文件這兩個概念纠吴。
模塊指的是獨立的代碼單元,框架或應(yīng)用程序會作為一個獨立的模塊來構(gòu)建和發(fā)布贰镣。在 Swift 中呜象,一個模塊可以使用import關(guān)鍵字導(dǎo)入另外一個模塊膳凝。
在 Swift 中碑隆,Xcode 的每個 target(例如框架或應(yīng)用程序)都被當(dāng)作獨立的模塊處理。如果你是為了實現(xiàn)某個通用的功能蹬音,或者是為了封裝一些常用方法而將代碼打包成獨立的框架上煤,這個框架就是 Swift 中的一個模塊。當(dāng)它被導(dǎo)入到某個應(yīng)用程序或者其他框架時著淆,框架內(nèi)容都將屬于這個獨立的模塊劫狠。
源文件就是 Swift 中的源代碼文件拴疤,它通常屬于一個模塊,即一個應(yīng)用程序或者框架独泞。盡管我們一般會將不同的類型分別定義在不同的源文件中呐矾,但是同一個源文件也可以包含多個類型、函數(shù)之類的定義懦砂。
2>訪問級別
Swift 為代碼中的實體提供了三種不同的訪問級別蜒犯。這些訪問級別不僅與源文件中定義的實體相關(guān),同時也與源文件所屬的模塊相關(guān)荞膘。
public:可以訪問同一模塊源文件中的任何實體罚随,在模塊外也可以通過導(dǎo)入該模塊來訪問源文件里的所有實體。通常情況下羽资,框架中的某個接口可以被任何人使用時淘菩,你可以將其設(shè)置為public級別。
internal:可以訪問同一模塊源文件中的任何實體屠升,但是不能從模塊外訪問該模塊源文件中的實體潮改。通常情況下,某個接口只在應(yīng)用程序或框架內(nèi)部使用時腹暖,你可以將其設(shè)置為internal級別进陡。
private:限制實體只能在所在的源文件內(nèi)部使用。使用private級別可以隱藏某些功能的實現(xiàn)細(xì)節(jié)微服。
public為最高(限制最少)訪問級別趾疚,private為最低(限制最多)訪問級別绢涡。
需要注意的是Swift 中的private訪問級別不同于其他語言掌动,它的范圍限于源文件,而不是聲明范圍內(nèi)牌捷。這就意味著丛肮,一個類型可以訪問其所在源文件中的所有private實體赡磅,但是如果它的擴(kuò)展定義在其他源文件中,那么它的擴(kuò)展就不能訪問它在這個源文件中定義的private實體宝与。
3>訪問級別基本原則
Swift 中的訪問級別遵循一個基本原則:不可以在某個實體中定義訪問級別更高的實體焚廊。
例如:
一個public訪問級別的變量,其類型的訪問級別不能是internal或private习劫。因為無法保證變量的類型在使用變量的地方也具有訪問權(quán)限咆瘟。
函數(shù)的訪問級別不能高于它的參數(shù)類型和返回類型的訪問級別。因為如果函數(shù)定義為public而參數(shù)類型或者返回類型定義為internal或private诽里,就會出現(xiàn)函數(shù)可以在任何地方被訪問袒餐,但是它的參數(shù)類型和返回類型卻不可以。
4>元組類型的訪問級別
元組的訪問級別將由元組中訪問級別最嚴(yán)格的類型來決定。例如灸眼,如果你構(gòu)建了一個包含兩種不同類型的元組卧檐,其中一個類型為internal級別,另一個類型為private級別焰宣,那么這個元組的訪問級別為private霉囚。
注意
元組不同于類、結(jié)構(gòu)體匕积、枚舉佛嬉、函數(shù)那樣有單獨的定義。元組的訪問級別是在它被使用時自動推斷出的闸天,而無法明確指定暖呕。
5>自定義類型訪問級別
一個public類型的所有成員的訪問級別默認(rèn)為internal級別,而不是public級別苞氮。如果你想將某個成員指定為public級別湾揽,那么你必須顯式指定。這樣做的好處是笼吟,在你定義公共接口的時候库物,可以明確地選擇哪些接口是需要公開的,哪些是內(nèi)部使用的贷帮,避免不小心將內(nèi)部使用的接口公開.
6>可選鏈?zhǔn)秸{(diào)用
可選鏈?zhǔn)秸{(diào)用(Optional Chaining)是一種可以在當(dāng)前值可能為nil的可選值上請求和調(diào)用屬性戚揭、方法及下標(biāo)的方法。如果可選值有值撵枢,那么調(diào)用就會成功民晒;如果可選值是nil,那么調(diào)用將返回nil锄禽。多個調(diào)用可以連接在一起形成一個調(diào)用鏈潜必,如果其中任何一個節(jié)點為nil,整個調(diào)用鏈都會失敗沃但,即返回nil磁滚。
Swift 的可選鏈?zhǔn)秸{(diào)用和 Objective-C 中向nil發(fā)送消息有些相像,但是 Swift 的可選鏈?zhǔn)秸{(diào)用可以應(yīng)用于任意類型宵晚,并且能檢查調(diào)用是否成功垂攘。
訪問控制詳情:http://www.swiftmi.com/swiftbook_cn/chapter2/24_Access_Control.html