访问修饰符有: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
元组类型的访问级别遵循元组中字段最低级的访问级别
枚举类型的访问级别
枚举类型的访问级别继承自该枚举,因此我们不能为枚举中的成员指定访问级别。