參考官方文檔
前置知識:模塊和源文件
創(chuàng)建一個iOS項目來對比學(xué)習(xí)
模塊
獨立的單元構(gòu)建和發(fā)布單位,實現(xiàn)某個特定功能的代碼集合
創(chuàng)建的一個項目就是一個模塊
import 導(dǎo)入別人的模塊(本質(zhì)是別人寫好的項目,直接拿過來用),演示查看UIKIT源代碼,導(dǎo)入了很多模塊
注意:模塊不是目錄,更不是文件夾,而是某個功能的集合,比如UIKit、第三方框架(snapkit)等
源文件
是一個模塊中的單個 Swift 源代碼文件。
訪問權(quán)限
訪問權(quán)限可以修飾 類、方法、屬性等。
open 和 public :允許實體被自己定義的模塊中的任意源文件訪問,也可以被另一模塊的源文件通過導(dǎo)入該定義模塊來訪問。在指定框架的公共接口時,通常使用 open 或 public。
【演示】查看UIKIT源代碼,里面的方法幾乎都是publicinternal:——不能出模塊(項目)
允許實體被定義模塊中的任意源文件訪問,但不能被該模塊之外的任何源文件訪問。通常在定義應(yīng)用程序或是框架的內(nèi)部結(jié)構(gòu)時使用。(默認(rèn)級別)
【演示】隨便創(chuàng)建一個類SecVC,可以在ViewController中訪問到。fileprivate——不能出當(dāng)前源文件
將實體的使用限制于當(dāng)前定義源文件中。
【演示】
1、新定義一個Woker類,其中fileprivate修飾的name,在另一個文件VC中無法訪問
class Worker{
fileprivate var name:String
override init() {
self.salary = 6000
self.name = "miao"
}
}
2、在woker類的源文件中新定義一個Company類,可以訪問name屬性
class Company{
var mishu:Worker
init(mishu:Worker) {
self.mishu = mishu
}
func printInfo(){
print(mishu.name) //可訪問name
}
}
- private : ——不能出當(dāng)前作用域
將實體的使用限制于封閉聲明中,比fileprivate更嚴(yán)格。
【演示】
在woker類的新增屬性salary,同文件Company類中也訪問不了
class Worker: {
fileprivate var name:String
private var salary:Int
init() {
self.salary = 6000
self.name = "miao"
}
}
class Company{
var mishu:Worker
init(mishu:Worker) {
self.mishu = mishu
}
func printInfo(){
print(mishu.name) //可訪問name
//print(mishu.salary) //不可訪問salary
}
}
訪問原則
Swift 中的訪問級別遵循一個基本原則:實體不能定義在具有更低訪問級別(更嚴(yán)格)的實體中。