訪問控制解析
簡介:
和其他高級語言一樣Swift中也增加了訪問控制,在Swift中提供了private刃永、internal舔清、public三種訪問級別含友,但是不同的是Swift中的訪問級別是基于模塊(module,或者target)和源文件(.swift文件)的钮热,而不是基于類型填抬、命名空間聲明。
1.相關概念
模塊
指的是獨立的代碼單元隧期,框架或應用程序會作為一個獨立的模塊來構建和發(fā)布飒责。在 Swift 中赘娄,一個模塊可以使用 import 關鍵字導入另外一個模塊。實體
:對于代碼中可以設置訪問級別的特性(屬性宏蛉、基本類型遣臼、函數(shù)等),稱之為實體
拾并。源文件
就是 Swift 中的源代碼文件揍堰,它通常屬于一個模塊
,即一個應用程序或者框架嗅义。盡管我們一般會將不同的類型分別定義在不同的源文件中屏歹,但是同一個源文件也可以包含多個類型、函數(shù)之類的定義之碗。
2.關鍵字介紹
public
:可以訪問同一模塊源文件中的任何實體蝙眶,在模塊外也可以通過導入該模塊來訪問源文件里的所有實體。通常情況下褪那,框架中的某個接口可以被任何人使用時幽纷,你可以將其設置為 public 級別。
(在模塊內部和外部都可以使用
)internal
:可以訪問同一模塊源文件中的任何實體武通,但是不能從模塊外訪問該模塊源文件中的實體霹崎。通常情況下妆艘,某個接口只在應用程序或框架內部使用時褥赊,你可以將其設置為 internal 級別。
(模塊內部使用, 應用程序或者框架內部
)private
:限制實體只能在所在的源文件內部使用匙握。使用 private 級別可以隱藏某些功能的實現(xiàn)細節(jié)囚枪。
(只能在當前源文件中使用
)
- 注意:Swift 中的 private 訪問級別不同于其他語言派诬,它的范圍限于源文件,而不是聲明范圍內
3.使用注意:
- 1> public 為最高(限制最少)訪問級別链沼,private 為最低(限制最多)訪問級別默赂。
- 2> Swift 中的訪問級別遵循一個基本原則:
不可以在某個實體中定義訪問級別更高的實體
。
一個類型的訪問級別也會影響到類型成員(屬性括勺、方法缆八、構造器、下標)的默認訪問級別疾捍。
如果你將類型指定為 private 級別奈辰,那么該類型的所有成員的默認訪問級別也會變成 private。
如果你將類型指定為 public 或者 internal 級別(或者不明確指定訪問級別乱豆,而使用默認的 internal 訪問級別)奖恰,那么該類型的所有成員的默認訪問級別將是 internal。
上面提到,一個 public 類型的所有成員的訪問級別默認為 internal 級別瑟啃,而不是 public 級別论泛。
如果你想將某個成員指定為 public 級別,那么你必須
顯式指定
蛹屿。這樣做的好處是屁奏,在你定義公共接口的時候,可以明確地選擇哪些接口是需要公開的蜡峰,哪些是內部使用的了袁,避免不小心將內部使用的接口公開。
練習:
public class SomePublicClass { // 顯式的 public 類
public var somePublicProperty = 0 // 顯式的 public 類成員
var someInternalProperty = 0 // 隱式的 internal 類成員
private func somePrivateMethod() {} // 顯式的 private 類成員
}
class SomeInternalClass { // 隱式的 internal 類
var someInternalProperty = 0 // 隱式的 internal 類成員
private func somePrivateMethod() {} // 顯式的 private 類成員
}
private class SomePrivateClass { // 顯式的 private 類
var somePrivateProperty = 0 // 隱式的 private 類成員
func somePrivateMethod() {} // 隱式的 private 類成員
}