Access Control(訪問控制)

//這章看到吐诗祸,以后有機會了再看

//訪問控制 Access Control
//“訪問控制可以限定其他源文件或模塊中的代碼對你的代碼的訪問級別。這個特性可以讓我們隱藏代碼的一些實現(xiàn)細節(jié)突照,并且可以為其他人可以訪問和使用的代碼提供接口帮非。
// “你可以明確地給單個類型(類、結構體讹蘑、枚舉)設置訪問級別末盔,也可以給這些類型的屬性、方法座慰、構造器陨舱、下標等設置訪問級別。協(xié)議也可以被限定在一定的范圍內使用版仔,包括協(xié)議里的全局常量隅忿、變量和函數(shù)”
//“Swift 不僅提供了多種不同的訪問級別心剥,還為某些典型場景提供了默認的訪問級別,這樣就不需要我們在每段代碼中都申明顯式訪問級別”

//1. 模板和源文件
//“Swift 中的訪問控制模型基于模塊和源文件這兩個概念背桐。”
//“模塊指的是獨立的代碼單元蝉揍,框架或應用程序會作為一個獨立的模塊來構建和發(fā)布链峭。在 Swift 中,一個模塊可以使用 import 關鍵字導入另外一個模塊又沾”滓牵”
//“在 Swift 中,Xcode 的每個目標(例如框架或應用程序)都被當作獨立的模塊處理杖刷。如果你是為了實現(xiàn)某個通用的功能励饵,或者是為了封裝一些常用方法而將代碼打包成獨立的框架,這個框架就是 Swift 中的一個模塊”
//“源文件就是 Swift 中的源代碼文件滑燃,它通常屬于一個模塊役听,即一個應用程序或者框架。盡管我們一般會將不同的類型分別定義在不同的源文件中表窘,但是同一個源文件也可以包含多個類型典予、函數(shù)之類的定義±盅希”

//2. 訪問級別
//2.1“五種不同的訪問級別”
/*
“開放訪問和公開訪問可以訪問同一模塊源文件中的任何實體瘤袖,在模塊外也可以通過導入該模塊來訪問源文件里的所有實體。通常情況下昂验,框架中的某個接口可以被任何人使用時捂敌,你可以將其設置為開放或者公開訪問。
“內部訪問可以訪問同一模塊源文件中的任何實體既琴,但是不能從模塊外訪問該模塊源文件中的實體占婉。通常情況下,某個接口只在應用程序或框架內部使用時呛梆,你可以將其設置為內部訪問锐涯。”
“文件私有訪問限制實體只能被所定義的文件內部訪問填物。當需要把這些細節(jié)被整個文件使用的時候纹腌,使用文件私有訪問隱藏了一些特定功能的實現(xiàn)細節(jié)≈突牵”
“私有訪問限制實體只能在所定義的作用域內使用升薯。需要把這些細節(jié)被整個作用域使用的時候,使用文件私有訪問隱藏了一些特定功能的實現(xiàn)細節(jié)击困∠雅”
*/

//2.2
/*
//“開放訪問為最高(限制最少)訪問級別广凸,私有訪問為最低(限制最多)訪問級別。
“開放訪問只作用于類類型和類的成員蛛枚,它和公開訪問的區(qū)別如下:

公開訪問或者其他更嚴訪問級別的類谅海,只能在它們定義的模塊內部被繼承。
公開訪問或者其他更嚴訪問級別的類成員蹦浦,只能在它們定義的模塊內部的子類中重寫扭吁。
開放訪問的類,可以在它們定義的模塊中被繼承盲镶,也可以在引用它們的模塊中被繼承侥袜。
開放訪問的類成員,可以在它們定義的模塊中子類中重寫溉贿,也可以在引用它們的模塊中的子類重寫枫吧。
把一個類標記為開放,顯式地表明宇色,你認為其他模塊中的代碼使用此類作為父類九杂,然后你已經(jīng)設計好了你的類的代碼了〈”
*/

//2.3 “訪問級別基本原則”
//“Swift 中的訪問級別遵循一個基本原則:不可以在某個實體中定義訪問級別更低(更嚴格)的實體尼酿。”
/*
例如:
“一個公開訪問級別的變量植影,其類型的訪問級別不能是內部裳擎,文件私有或是私有類型的。因為無法保證變量的類型在使用變量的地方也具有訪問權限思币。
函數(shù)的訪問級別不能高于它的參數(shù)類型和返回類型的訪問級別鹿响。因為這樣就會出現(xiàn)函數(shù)可以在任何地方被訪問,但是它的參數(shù)類型和返回類型卻不可以的情況谷饿』涛遥”

*/

//2.4 默認訪問級別
//“如果你不為代碼中的實體顯式指定訪問級別,那么它們默認為 internal 級別(有一些例外情況博投,稍后會進行說明)绸贡。因此,在大多數(shù)情況下毅哗,我們不需要顯式指定實體的訪問級別听怕。”
//“當你編寫一個單目標應用程序時虑绵,應用的所有功能都是為該應用服務尿瞭,而不需要提供給其他應用或者模塊使用,所以我們不需要明確設置訪問級別翅睛,使用默認的訪問級別 internal 即可声搁。但是黑竞,你也可以使用文件私有訪問或私有訪問級別,用于隱藏一些功能的實現(xiàn)細節(jié)疏旨。

//2.5“框架的訪問級別”
//“當你開發(fā)框架時很魂,就需要把一些對外的接口定義為開放訪問或公開訪問級別,以便使用者導入該框架后可以正常使用其功能充石。這些被你定義為對外的接口莫换,就是這個框架的 API≈枇澹”
//“注意 框架依然會使用默認的內部訪問級別,也可以指定為文件私有訪問或者私有訪問級別坷剧。當你想把某個實體作為框架的 API 的時候惰爬,需顯式為其指定開放訪問或公開訪問級別”蛊螅”

//2.6 “單元測試目標的訪問級別”
//“當你的應用程序包含單元測試目標時撕瞧,為了測試,測試模塊需要訪問應用程序模塊中的代碼狞尔。默認情況下只有開放訪問或公開訪問級別級別的實體才可以被其他模塊訪問丛版。然而,如果在導入應用程序模塊的語句前使用 @testable 特性偏序,然后在允許測試的編譯設置(Build Options -> Enable Testability)下編譯這個應用程序模塊页畦,單元測試目標就可以訪問應用程序模塊中所有內部級別的實體。

//3. 訪問控制語法
//“通過修飾符 open研儒,public豫缨,internal,filepart端朵,private 來聲明實體的訪問級別”
//“除非專門指定好芭,否則實體默認的訪問級別為內部訪問級別”

//4.自定義類型
//“如果想為一個自定義類型指定訪問級別,在定義類型時進行指定即可冲呢。新類型只能在它的訪問級別限制范圍內使用”
//“一個類型的訪問級別也會影響到類型成員(屬性舍败、方法、構造器敬拓、下標)的默認訪問級別邻薯。如果你將類型指定為私有或者文件私有級別,那么該類型的所有成員的默認訪問級別也會變成私有或者文件私有級別恩尾。如果你將類型指定為公開或者內部訪問級別(或者不明確指定訪問級別弛说,而使用默認的內部訪問級別),那么該類型的所有成員的默認訪問級別將是內部訪問翰意∧救耍”
//“重要 上面提到信柿,一個公開類型的所有成員的訪問級別默認為內部訪問級別,而不是公開級別醒第。如果你想將某個成員指定為公開訪問級別渔嚷,那么你必須顯式指定。這樣做的好處是稠曼,在你定義公共接口的時候形病,可以明確地選擇哪些接口是需要公開的,哪些是內部使用的霞幅,避免不小心將內部使用的接口公開漠吻。”

//4.2 元組類型
//“元組的訪問級別將由元組中訪問級別最嚴格的類型來決定”
//“注意 元組不同于類司恳、結構體途乃、枚舉、函數(shù)那樣有單獨的定義扔傅。元組的訪問級別是在它被使用時自動推斷出的耍共,而無法明確指定×匀”

//4.3 函數(shù)類型
//“函數(shù)的訪問級別根據(jù)訪問級別最嚴格的參數(shù)類型或返回類型的訪問級別來決定试读。但是,如果這種訪問級別不符合函數(shù)定義所在環(huán)境的默認訪問級別荠耽,那么就需要明確地指定該函數(shù)的訪問級別钩骇。”

//func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// 此處是函數(shù)實現(xiàn)部分
//}
//“我們可以看到骇塘,這個函數(shù)的返回類型是一個元組伊履,該元組中包含兩個自定義的類。其中一個類的訪問級別是 internal款违,另一個的訪問級別是 private唐瀑,所以根據(jù)元組訪問級別的原則,該元組的訪問級別是 private,

//“因為該函數(shù)返回類型的訪問級別是 private插爹,所以你必須使用 private 修飾符哄辣,明確指定該函數(shù)的訪問級別”
//private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// 此處是函數(shù)實現(xiàn)部分
//}
//“將該函數(shù)指定為 public 或 internal,或者使用默認的訪問級別 internal 都是錯誤的赠尾,因為如果把該函數(shù)當做 public 或 internal 級別來使用的話力穗,可能會無法訪問 private 級別的返回值∑蓿”

//4.4 枚舉類型
//“枚舉成員的訪問級別和該枚舉類型相同当窗,你不能為枚舉成員單獨指定不同的訪問級別〈缦”
//“枚舉定義中的任何原始值或關聯(lián)值的類型的訪問級別至少不能低于枚舉類型的訪問級別”

//4.5 嵌套類型
//“如果在 private 級別的類型中定義嵌套類型崖面,那么該嵌套類型就自動擁有 private 訪問級別元咙。如果在 public 或者 internal 級別的類型中定義嵌套類型,那么該嵌套類型自動擁有 internal 訪問級別巫员。如果想讓嵌套類型擁有 public 訪問級別庶香,那么需要明確指定該嵌套類型的訪問級別〖蚴叮”

//5. 子類
//“子類的訪問級別不得高于父類的訪問級別”
//“此外赶掖,你可以在符合當前訪問級別的條件下重寫任意類成員(方法、屬性七扰、構造器奢赂、下標等)”

//“可以通過重寫為繼承來的類成員提供更高的訪問級別。下面的例子中颈走,類 A 的訪問級別是 public呈驶,它包含一個方法 someMethod(),訪問級別為 private疫鹊。類 B 繼承自類 A,訪問級別為 internal司致,但是在類 B 中重寫了類 A 中訪問級別為 private 的方法 someMethod()拆吆,并重新指定為 internal 級別。通過這種方式脂矫,我們就可以將某類中 private 級別的類成員重新指定為更高的訪問級別枣耀,以便其他人使用:”
//public class A{
// private func someMethod(){}
//}
//internal class B : A {
// override internal func someMethod(){}
//}

//6. 變量,常量庭再,屬性捞奕,下標
//“常量、變量拄轻、屬性不能擁有比它們的類型更高的訪問級別”
//“如果常量颅围、變量、屬性恨搓、下標的類型是 private 級別的院促,那么它們必須明確指定訪問級別為 private:”

//6.2 getter和setter
//“常量、變量斧抱、屬性常拓、下標的 Getters 和 Setters 的訪問級別和它們所屬類型的訪問級別相同』云郑”
//“Setter 的訪問級別可以低于對應的 Getter 的訪問級別弄抬,這樣就可以控制變量、屬性或下標的讀寫權限宪郊。在 var 或 subscript 關鍵字之前掂恕,你可以通過 fileprivate(set)拖陆,private(set) 或 internal(set) 為它們的寫入權限指定更低的訪問級別≈窈#”

//7.構造器
//“自定義構造器的訪問級別可以低于或等于其所屬類型的訪問級別慕蔚。唯一的例外是必要構造器斋配,它的訪問級別必須和所屬類型的訪問級別相同”
//“如同函數(shù)或方法的參數(shù)孔飒,構造器參數(shù)的訪問級別也不能低于構造器本身的訪問級別”
//“默認構造器的訪問級別與所屬類型的訪問級別相同,除非類型的訪問級別是 public艰争。如果一個類型被指定為 public 級別甩卓,那么默認構造器的訪問級別將為 internal缀棍。如果你希望一個 public 級別的類型也能在其他模塊中使用這種無參數(shù)的默認構造器,你只能自己提供一個 public 訪問級別的無參數(shù)構造器青瀑∠艚耄”
//“結構體默認的成員逐一構造器 如果結構體中任意存儲型屬性的訪問級別為 private哑诊,那么該結構體默認的成員逐一構造器的訪問級別就是 private。否則淹禾,這種構造器的訪問級別依然是 internal铃岔≈侨拢”

//8.協(xié)議
//“如果想為一個協(xié)議類型明確地指定訪問級別,在定義協(xié)議時指定即可猜嘱。這將限制該協(xié)議只能在適當?shù)脑L問級別范圍內被采納朗伶。”
//“協(xié)議中的每一個要求都具有和該協(xié)議相同的訪問級別点晴。你不能將協(xié)議中的要求設置為其他訪問級別觉鼻。這樣才能確保該協(xié)議的所有要求對于任意采納者都將可用捐康。”
//“注意 如果你定義了一個 public 訪問級別的協(xié)議花枫,那么該協(xié)議的所有實現(xiàn)也會是 public 訪問級別劳翰。這一點不同于其他類型馒疹,例如听想,當類型是 public 訪問級別時汉买,其成員的訪問級別卻只是 internal”
//“如果定義了一個繼承自其他協(xié)議的新協(xié)議蛙粘,那么新協(xié)議擁有的訪問級別最高也只能和被繼承協(xié)議的訪問級別相同”
//“一個類型可以采納比自身訪問級別低的協(xié)議,“采納了協(xié)議的類型的訪問級別取它本身和所采納協(xié)議兩者間最低的訪問級別组题〈蘖校”

//9.擴展
//“你可以在訪問級別允許的情況下對類赵讯、結構體、枚舉進行擴展。擴展成員具有和原始類型成員一致的訪問級別”

//10.泛型
//“泛型類型或泛型函數(shù)的訪問級別取決于泛型類型或泛型函數(shù)本身的訪問級別铛纬,還需結合類型參數(shù)的類型約束的訪問級別告唆,根據(jù)這些訪問級別中的最低訪問級別來確定《粒”
//“你定義的任何類型別名都會被當作不同的類型,以便于進行訪問控制夏伊。類型別名的訪問級別不可高于其表示的類型的訪問級別”

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末垄懂,一起剝皮案震驚了整個濱河市漫谷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖肘迎,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狰挡,死亡現(xiàn)場離奇詭異加叁,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸳粉,你說我怎么就攤上這事扔涧。” “怎么了届谈?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵枯夜,是天一觀的道長。 經(jīng)常有香客問我艰山,道長湖雹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任曙搬,我火速辦了婚禮摔吏,結果婚禮上鸽嫂,老公的妹妹穿的比我還像新娘。我一直安慰自己征讲,他們只是感情好据某,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稳诚,像睡著了一般哗脖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扳还,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天才避,我揣著相機與錄音,去河邊找鬼氨距。 笑死桑逝,一個胖子當著我的面吹牛,可吹牛的內容都是我干的俏让。 我是一名探鬼主播楞遏,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼首昔!你這毒婦竟也來了寡喝?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勒奇,失蹤者是張志新(化名)和其女友劉穎预鬓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赊颠,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡格二,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了竣蹦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顶猜。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖痘括,靈堂內的尸體忽然破棺而出长窄,到底是詐尸還是另有隱情,我是刑警寧澤纲菌,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布挠日,位于F島的核電站,受9級特大地震影響驰后,放射性物質發(fā)生泄漏。R本人自食惡果不足惜矗愧,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一灶芝、第九天 我趴在偏房一處隱蔽的房頂上張望郑原。 院中可真熱鬧,春花似錦夜涕、人聲如沸犯犁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酸役。三九已至,卻和暖如春驾胆,著一層夾襖步出監(jiān)牢的瞬間涣澡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工丧诺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留入桂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓驳阎,卻偏偏與公主長得像抗愁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子呵晚,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359