訪問修飾符有:open、public、internal、fileprivate、private
訪問修飾符可以修飾面向對象的類型,以及變量常量下標元組函數屬性等“實體”。
模塊:
一個應用程序包(Application可以執行,包含很多Swift文件以及其他文件)或者 一個框架(不可執行文件,Swift文件以及其他文件的集合) import引用
源文件:
.swift文件,編譯之后被包含在應用程序包或者框架中
1、open
任何open實體,無論在自己模塊,還是其他模塊都可以被訪問,open有個使用說明:only classes and overridable class members can be declared 'open'--即open只能適用于類class
2、public
約等于open,在同一模塊中open等于public,在不同模塊時,public所聲明的類不能被繼承,public所聲明的屬性和方法不能被重寫(override)
3、internal
默認訪問權限。只能在自己模塊中被訪問
4、fileprivate
只能在當前文件中被訪問
5、private
只能在類型內部被訪問
統一性原則
1、如果一個類型(包括類、結構體、枚舉),定義為internal或者private,那么類型聲明的變量或者常量(實例化)不能使用public訪問級別。
private class Employee{
var no: Int = 0
var name: String = ""
var job: String?
var salary: Double = 0
var dept: Department?
}
internal struct Department{
var no: Int = 0
var name: String = ""
}
public let emp = Employee() // fileprivate\private是可以的
public var dept = Department()
// 編譯報錯:Playground execution failed: error: MyPlayground.playground:12:12: error: constant cannot be declared public because its type 'Employee' uses a private type
public let emp = Employee()
^
error: MyPlayground.playground:13:12: error: variable cannot be declared public because its type 'Department' uses an internal type
public var dept = Department()
^
2、函數的訪問權限級別不能高于它的參數和返回值類型(類、結構體、枚舉)的訪問級別
class Employee{
var no: Int = 0
var name: String = ""
var job: String?
var salary: Double = 0
var dept: Department?
}
struct Department{
var no: Int = 0
var name: String = ""
}
public func getEmpDept(emp: Employee)->Department?{
return emp.dept
}
// 編譯失敗:Playground execution failed: error: MyPlayground.playground:11:14: error: function cannot be declared public because its parameter uses an internal type
public func getEmpDept(emp: Employee)->Department?{
^ ~~~~~~~~
會有函數可以被任何人訪問,而他的參數和返回類型不可以訪問的矛盾情況
設計原則
1、如果本應用程序訪問,默認的訪問級別就可以。
2、如果是框架的開發,讓別人使用的就public,不讓別人看到的就設定為internal private
元組類型的訪問級別遵循元組中字段最低級的訪問級別
枚舉類型的訪問級別
枚舉類型的訪問級別繼承自該枚舉,因此我們不能為枚舉中的成員指定訪問級別。