前言
本文主要給大家介紹了關(guān)于Swift訪問控制的相關(guān)內(nèi)容,訪問控制對訪問你的其他代碼源文件和模塊部分進(jìn)行了約束。這個特性允許你隱藏你的代碼實現(xiàn),并且指定通過其可以訪問和使用該代碼的優(yōu)選接口。
class,structure 和 enumeration 都可以指定訪問級別,當(dāng)然,property,method,initializer 和 屬于這里類型的 subscript。protocol 可以限制到某個上下文,全局變量,變量和函數(shù)也可以。
另外,Swift 也提供默認(rèn)的使用級別給典型的使用場景。確實,如果你編寫一款單一目標(biāo)的 app,你可能根本不需要明確地指定訪問控制級別。
模塊和源文件
Swift的訪問控制模型是基于模塊和源文件的概念。
一個模塊是單個的代碼分布單元————一個 framework 或者應(yīng)用程序是作為單個單元編譯和傳遞的,他們能夠通過 Swift 的 import 關(guān)鍵字被其他模塊導(dǎo)入。
在Swift 中, Xcode的每一個 build target(如 一個 app bundle 或者 framework)被當(dāng)成一個單獨的模塊。
雖然通常做法是在不同的源文件定義不同的類型,然而一個源文件事實上可以包含不同的類型,函數(shù)等的定義。
訪問級別
Swift 為你的代碼實體提供5個不同的訪問級別:
Open 訪問是最高訪問級別,private 是最低訪問級別(最大限制性)。
Open 訪問只用在類和類成員,他和 publick 訪問的區(qū)別如下:
簡單來說就是 public 和 open 的區(qū)別就是public 比 open 少了模塊外的類繼承和類成員重寫的權(quán)限。
訪問級別的指導(dǎo)原則
在 Swift 中,訪問級別遵從總的指導(dǎo)原則是:沒有實體可以被定義在另外一個擁有較低訪問級別(更多限制)的實體之內(nèi)。
例如:
下面會有更詳細(xì)的介紹。
默認(rèn)的訪問級別
如果你自己沒有指定一個明確的訪問級別,所有代碼中的實體都有一個默認(rèn)的internal訪問級別。結(jié)果,在很多情況下你不需要對你的代碼指定明確的訪問級別。
單目標(biāo)應(yīng)用程序的訪問級別
如果你寫的是一個 i 簡單的單目標(biāo)應(yīng)該程序,那么你的程序代碼就是典型的自包含程序,并不需要在程序模塊的外部進(jìn)行使用。默認(rèn)的訪問級別 internal 已經(jīng)滿足這個需求。因此,你不需要去指定一個訪問級別。然而,你可能需要把你部分的代碼標(biāo)記為文件私有或者私有,從而使得在程序模塊中的其他代碼隱藏他們的實現(xiàn)細(xì)節(jié)。
Frameworks 的訪問級別
當(dāng)你開發(fā)一個 framework,標(biāo)記 open 或者 public 以便它能夠被其他模塊訪問到,例如某個程序引入這個 framework 的時候。這個面向公眾的接口是framework 的程序編程接口(或者 API)。
值得注意的是:任何 framework 的內(nèi)部實現(xiàn)細(xì)節(jié)都還可以使用默認(rèn)的內(nèi)部訪問級別,或者可以標(biāo)識為私有或者文件私有級別,如果你想對framework 的其他部分內(nèi)部代碼隱藏他們的話。只有當(dāng)你想讓一個實體成為你的 framework 的 API 的一部分的話,那么你就需要把這個實體標(biāo)識為 open 或者 public。
單元測試目標(biāo)的訪問級別
當(dāng)你寫的是一個包含單元測試目標(biāo)的程序時,那么你需要讓你程序中的代碼可以被測試模塊使用到以便于測試。一般情況下,只有被標(biāo)識為 open 或者 public 的實體才可以被其他模塊訪問到。然而,如果你把產(chǎn)品的模塊 import 聲明前加入 @testable 屬性并且在打開測試選項下編譯產(chǎn)品模塊的話,那么單元測試目標(biāo)就能夠訪問任何的 internal 實體。
訪問級別語法
為實體定義訪問級別:
public class SomePublicClass {}internal class SomeInternalClass {}fileprivate class SomeFilePrivateClass {}private class SomePrivateClass {} public var somePublicVariable = 0internal let someInternalConstant = 0fileprivate func someFilePrivateFunction() {}private func somePrivateFunction() {}除非有其他的指定,否則的話默認(rèn)的訪問基本是 internal,這也就意味著 SomeInternalClass 和 someInternalConstant 能夠在不明確訪問級別修飾符的情況下也還擁有 internal 的訪問級別:
class SomeInternalClass {} // 隱式 internallet someInternalConstant = 0 // 隱式 internal總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。
翻譯自:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3
新聞熱點
疑難解答
圖片精選