前置知識(shí):模塊和源文件
模塊
獨(dú)立的單元構(gòu)建和發(fā)布單位屑咳,實(shí)現(xiàn)某個(gè)特定功能的代碼集合
創(chuàng)建的一個(gè)項(xiàng)目就是一個(gè)模塊
import 導(dǎo)入別人的模塊(本質(zhì)是別人寫好的項(xiàng)目潦蝇,直接拿過(guò)來(lái)用),演示查看UIKIT源代碼字柠,導(dǎo)入了很多模塊
注意:模塊不是目錄弧哎,更不是文件夾朵逝,而是某個(gè)功能的集合萌业,比如UIKit坷襟、第三方框架(snapkit)等
源文件
是一個(gè)模塊中的單個(gè) Swift 源代碼文件。
訪問(wèn)權(quán)限
訪問(wèn)權(quán)限可以修飾 類生年、方法婴程、屬性等。
- open 和 public :允許實(shí)體被自己定義的模塊中的任意源文件訪問(wèn)抱婉,也可以被另一模塊的源文件通過(guò)導(dǎo)入該定義模塊來(lái)訪問(wèn)档叔。在指定框架的公共接口時(shí),通常使用 open 或 public蒸绩。
【演示】查看UIKIT源代碼衙四,里面的方法幾乎都是public- internal:——不能出模塊(項(xiàng)目)
允許實(shí)體被定義模塊中的任意源文件訪問(wèn),但不能被該模塊之外的任何源文件訪問(wèn)患亿。通常在定義應(yīng)用程序或是框架的內(nèi)部結(jié)構(gòu)時(shí)使用传蹈。(默認(rèn)級(jí)別)
【演示】隨便創(chuàng)建一個(gè)類SecVC,可以在ViewController中訪問(wèn)到步藕。- fileprivate——不能出當(dāng)前源文件
將實(shí)體的使用限制于當(dāng)前定義源文件中惦界。
【演示】
//1、新定義一個(gè)Woker類咙冗,其中fileprivate修飾的name表锻,在另一個(gè)文件VC中無(wú)法訪問(wèn)
class Worker{
fileprivate var name:String
override init() {
self.salary = 6000
self.name = "miao"
}
}
//2、在woker類的源文件中新定義一個(gè)Company類乞娄,可以訪問(wèn)name屬性
class Company{
var mishu:Worker
init(mishu:Worker) {
self.mishu = mishu
}
func printInfo(){
print(mishu.name) //可訪問(wèn)name
}
}
- private : ——不能出當(dāng)前作用域
將實(shí)體的使用限制于封閉聲明中瞬逊,比f(wàn)ileprivate更嚴(yán)格显歧。
【演示】
//在woker類的新增屬性salary,同文件Company類中也訪問(wèn)不了
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) //可訪問(wèn)name
//print(mishu.salary) //不可訪問(wèn)salary
}
}
訪問(wèn)原則
Swift 中的訪問(wèn)級(jí)別遵循一個(gè)基本原則:實(shí)體不能定義在具有更低訪問(wèn)級(jí)別(更嚴(yán)格)的實(shí)體中。
例如:
- 一個(gè) public 的變量确镊,其類型的訪問(wèn)級(jí)別不能是 internal士骤,fileprivate 或是 private。因?yàn)闊o(wú)法保證變量的類型在使用變量的地方也具有訪問(wèn)權(quán)限蕾域。
- 函數(shù)的訪問(wèn)級(jí)別不能高于它的參數(shù)類型和返回類型的訪問(wèn)級(jí)別拷肌。因?yàn)檫@樣就會(huì)出現(xiàn)函數(shù)可以在任何地方被訪問(wèn),但是它的參數(shù)類型和返回類型卻不可以的情況旨巷。