Swift學習之存取控制詳解

來源:互聯網
上載者:User

標籤:

本文和大家分享的主要是swift 中存取控制相關內容,一起來看看吧,希望對大家 學習swift有所協助。存取控制對訪問你的其他代碼源檔案和模組部分進行了約束。這個特性允許你隱藏你的代碼實現,並且指定通過其可以訪問和使用該代碼的優選介面。class , structure  和  enumeration  都可以指定存取層級,當然, property , method , initializer  和 屬於這裡類型的  subscript 。 protocol 可以限制到某個上下文,全域變數,變數和函數也可以。另外,Swift  也提供預設的使用層級給典型的使用情境。確實,如果你編寫一款單一目標的  app ,你可能根本不需要明確地指定存取控制層級。 模組和源檔案Swift 的存取控制模型是基於模組和源檔案的概念。一個模組是單個的代碼分布單元———— 一個  framework  或者應用程式是作為單個單元編譯和傳遞的,他們能夠通過  Swift  的  import 關鍵字被其他模組匯入。在Swift  中,  Xcode 的每一個  build target (如 一個  app bundle  或者  framework )被當成一個單獨的模組。雖然通常做法是在不同的源檔案定義不同的類型,然而一個源檔案事實上可以包含不同的類型,函數等的定義。 存取層級Swift  為你的代碼實體提供 5 個不同的存取層級:·Open  訪問和  public  訪問允許實體能夠被使用在任何來自起決定作用的模組的源檔案,或者來自於其他被匯入的模組的源檔案。通常使用  open  或者  public  來指定 framework  的公開介面。兩者的不同點將在下面進行描述。·Internal  訪問允許實體被使用在他們定義模型的任何源檔案裡面,但是不能在模組外部的任何源檔案使用。通常在定義一個  app  或者一個  framework  的內部結構的時候使用  internal  訪問。·File-private  訪問限制了在定義源檔案中實體的使用。使用  file-private  訪問來隱藏特定功能的實現細節,當這些細節在整個檔案中使用的時候。·Private  訪問將實體的使用限制在封閉聲明中。使用  private  訪問來隱藏特定功能的實現細節,當這些細節在單個聲明使用時。Open  訪問是最高存取層級, private  是最低存取層級(最大限制性)。Open  訪問只用在類和類成員,他和  publick  訪問的區別如下:· 使用  public  訪問的類, 或者其他更多限制性的存取層級,只能在定義的模組內建立子類。· 使用  public  訪問的類成員,或者其他更多限制性的存取層級,只能在定義的模組內被其子類重寫。·Open  類可以被定義的模組或者其他  import  該模組的地方建立子類。·Open  類成員可以被定義的模組或者其他  import  該模組的地方建立的子類重寫。簡單來說就是 public  和  open  的區別就是 public  比  open  少了模組外的類繼承和類成員重寫的許可權。 存取層級的指導原則在 Swift  中,存取層級遵從總的指導原則是:沒有實體可以被定義在另外一個擁有較低存取層級(更多限制)的實體之內。例如:·public 變數不能被定義為具有 internal, file-private 或者  private  類型,因為這種類型可能不能用在使用公開變數的任何地方。· 函數不能具有比其他參數類型和傳回型別更高的存取層級,因為該函數可以在其組成類型不可被周圍代碼使用的情況下使用。下面會有更詳細的介紹。 預設的存取層級如果你自己沒有指定一個明確的存取層級,所有代碼中的實體都有一個預設的internal 存取層級。結果,在很多情況下你不需要對你的代碼指定明確的存取層級。 單目標應用程式的存取層級如果你寫的是一個 i  簡單的單目標應該程式,那麼你的程式碼就是典型的自包含程式,並不需要在程式模組的外部進行使用。預設的存取層級  internal  已經滿足這個需求。因此,你不需要去指定一個存取層級。然而,你可能需要把你部分的代碼標記為檔案私人或者私人,從而使得在程式模組中的其他程式碼後置他們的實現細節。 Frameworks 的存取層級當你開發一個 framework ,標記  open  或者  public  以便它能夠被其他模組訪問到,例如某個程式引入這個  framework  的時候。這個面向公眾的介面是 framework  的程式編程介面(或者  API )。值得注意的是:任何 framework  的內部實現細節都還可以使用預設的內部存取層級,或者可以標識為私人或者檔案私人層級,如果你想對 framework  的其他部分內部程式碼後置他們的話。只有當你想讓一個實體成為你的  framework  的  API  的一部分的話,那麼你就需要把這個實體標識為  open  或者  public 。 單元測試目標的存取層級當你寫的是一個包含單元測試目標的程式時,那麼你需要讓你程式中的代碼可以被測試模組使用到以便於測試。一般情況下,只有被標識為 open  或者  public  的實體才可以被其他模組訪問到。然而,如果你把產品的模組  import  聲明前加入  @testable  屬性並且在開啟測試選項下編譯產品模組的話,那麼單元測試目標就能夠訪問任何的  internal  實體。 存取層級文法為實體定義存取層級: public  class  SomePublicClass{} internal  class  SomeInternalClass{}fileprivate  class  SomeFilePrivateClass{} private  class  SomePrivateClass{} public  var somePublicVariable = 0 internal  let someInternalConstant = 0fileprivate  func  someFilePrivateFunction() {} private  func  somePrivateFunction() {}除非有其他的指定,否則的話預設的訪問基本是 internal ,這也就意味著  SomeInternalClass  和 someInternalConstant  能夠在不明確存取層級修飾符的情況下也還擁有  internal  的存取層級: class  SomeInternalClass{}              //  隱式  internal let someInternalConstant = 0            //  隱式  internal來源:Mellong

Swift學習之存取控制詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.