歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Swift學(xué)習(xí)之訪問控制詳解

發(fā)布時間:2017-08-14 17:17  回復(fù):0  查看:2398   最后回復(fù):2017-08-14 17:17  
本文和大家分享的主要是swift 中訪問控制相關(guān)內(nèi)容,一起來看看吧,希望對大家 學(xué)習(xí)swift有所幫助。
  訪問控制對訪問你的其他代碼源文件和模塊部分進(jìn)行了約束。這個特性允許你隱藏你的代碼實(shí)現(xiàn),并且指定通過其可以訪問和使用該代碼的優(yōu)選接口。
  class structure  和  enumeration  都可以指定訪問級別,當(dāng)然, property , method initializer  和 屬于這里類型的  subscript 。 protocol 可以限制到某個上下文,全局變量,變量和函數(shù)也可以。
  另外,Swift  也提供默認(rèn)的使用級別給典型的使用場景。確實(shí),如果你編寫一款單一目標(biāo)的  app ,你可能根本不需要明確地指定訪問控制級別。
   模塊和源文件
  Swift 的訪問控制模型是基于模塊和源文件的概念。
  一個模塊是單個的代碼分布單元———— 一個  framework  或者應(yīng)用程序是作為單個單元編譯和傳遞的,他們能夠通過  Swift  的  import 關(guān)鍵字被其他模塊導(dǎo)入。
  在Swift  中,  Xcode 的每一個  build target (如 一個  app bundle  或者  framework )被當(dāng)成一個單獨(dú)的模塊。
  雖然通常做法是在不同的源文件定義不同的類型,然而一個源文件事實(shí)上可以包含不同的類型,函數(shù)等的定義。
   訪問級別
  Swift  為你的代碼實(shí)體提供 5 個不同的訪問級別:
  ·Open  訪問和  public  訪問允許實(shí)體能夠被使用在任何來自起決定作用的模塊的源文件,或者來自于其他被導(dǎo)入的模塊的源文件。通常使用  open  或者  public  來指定 framework  的公開接口。兩者的不同點(diǎn)將在下面進(jìn)行描述。
  ·Internal  訪問允許實(shí)體被使用在他們定義模型的任何源文件里面,但是不能在模塊外部的任何源文件使用。通常在定義一個  app  或者一個  framework  的內(nèi)部結(jié)構(gòu)的時候使用  internal  訪問。
  ·File-private  訪問限制了在定義源文件中實(shí)體的使用。使用  file-private  訪問來隱藏特定功能的實(shí)現(xiàn)細(xì)節(jié),當(dāng)這些細(xì)節(jié)在整個文件中使用的時候。
  ·Private  訪問將實(shí)體的使用限制在封閉聲明中。使用  private  訪問來隱藏特定功能的實(shí)現(xiàn)細(xì)節(jié),當(dāng)這些細(xì)節(jié)在單個聲明使用時。
  Open  訪問是最高訪問級別, private  是最低訪問級別(最大限制性)。
  Open  訪問只用在類和類成員,他和  publick  訪問的區(qū)別如下:
  · 使用  public  訪問的類, 或者其他更多限制性的訪問級別,只能在定義的模塊內(nèi)創(chuàng)建子類。
  · 使用  public  訪問的類成員,或者其他更多限制性的訪問級別,只能在定義的模塊內(nèi)被其子類重寫。
  ·Open  類可以被定義的模塊或者其他  import  該模塊的地方創(chuàng)建子類。
  ·Open  類成員可以被定義的模塊或者其他  import  該模塊的地方創(chuàng)建的子類重寫。
  簡單來說就是 public  和  open  的區(qū)別就是 public  比  open  少了模塊外的類繼承和類成員重寫的權(quán)限。
   訪問級別的指導(dǎo)原則
  在 Swift  中,訪問級別遵從總的指導(dǎo)原則是:沒有實(shí)體可以被定義在另外一個擁有較低訪問級別(更多限制)的實(shí)體之內(nèi)。
  例如:
  ·public 變量不能被定義為具有 internal, file-private 或者  private  類型,因?yàn)檫@種類型可能不能用在使用公共變量的任何地方。
  · 函數(shù)不能具有比其他參數(shù)類型和返回類型更高的訪問級別,因?yàn)樵摵瘮?shù)可以在其組成類型不可被周圍代碼使用的情況下使用。
  下面會有更詳細(xì)的介紹。
   默認(rèn)的訪問級別
  如果你自己沒有指定一個明確的訪問級別,所有代碼中的實(shí)體都有一個默認(rèn)的internal 訪問級別。結(jié)果,在很多情況下你不需要對你的代碼指定明確的訪問級別。
   單目標(biāo)應(yīng)用程序的訪問級別
  如果你寫的是一個 i  簡單的單目標(biāo)應(yīng)該程序,那么你的程序代碼就是典型的自包含程序,并不需要在程序模塊的外部進(jìn)行使用。默認(rèn)的訪問級別  internal  已經(jīng)滿足這個需求。因此,你不需要去指定一個訪問級別。然而,你可能需要把你部分的代碼標(biāo)記為文件私有或者私有,從而使得在程序模塊中的其他代碼隱藏他們的實(shí)現(xiàn)細(xì)節(jié)。
   Frameworks 的訪問級別
  當(dāng)你開發(fā)一個 framework ,標(biāo)記  open  或者  public  以便它能夠被其他模塊訪問到,例如某個程序引入這個  framework  的時候。這個面向公眾的接口是 framework  的程序編程接口(或者  API )。
  值得注意的是:任何 framework  的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)都還可以使用默認(rèn)的內(nèi)部訪問級別,或者可以標(biāo)識為私有或者文件私有級別,如果你想對 framework  的其他部分內(nèi)部代碼隱藏他們的話。只有當(dāng)你想讓一個實(shí)體成為你的  framework  的  API  的一部分的話,那么你就需要把這個實(shí)體標(biāo)識為  open  或者  public 。
   單元測試目標(biāo)的訪問級別
  當(dāng)你寫的是一個包含單元測試目標(biāo)的程序時,那么你需要讓你程序中的代碼可以被測試模塊使用到以便于測試。一般情況下,只有被標(biāo)識為 open  或者  public  的實(shí)體才可以被其他模塊訪問到。然而,如果你把產(chǎn)品的模塊  import  聲明前加入  @testable  屬性并且在打開測試選項(xiàng)下編譯產(chǎn)品模塊的話,那么單元測試目標(biāo)就能夠訪問任何的  internal  實(shí)體。
   訪問級別語法
  為實(shí)體定義訪問級別:
   public  class  SomePublicClass{} internal  class  SomeInternalClass{}
  fileprivate  class  SomeFilePrivateClass{} private  class  SomePrivateClass{}
   public  var somePublicVariable = 0 internal  let someInternalConstant = 0
  fileprivate  func  someFilePrivateFunction() {} private  func  somePrivateFunction() {}
  除非有其他的指定,否則的話默認(rèn)的訪問基本是 internal ,這也就意味著  SomeInternalClass  和  someInternalConstant  能夠在不明確訪問級別修飾符的情況下也還擁有  internal  的訪問級別:
   class  SomeInternalClass{}              //  隱式  internal let someInternalConstant = 0            //  隱式  internal
來源:Mellong

您還未登錄,請先登錄

熱門帖子

最新帖子

?