前置知识:模块和源文件
模块
独立的单元构建和发布单位,实现某个特定功能的代码集合
创建的一个项目就是一个模块
import 导入别人的模块(本质是别人写好的项目,直接拿过来用),演示查看UIKIT源代码,导入了很多模块
注意:模块不是目录,更不是文件夹,而是某个功能的集合,比如UIKit、第三方框架(snapkit)等
源文件
是一个模块中的单个 Swift 源代码文件。
访问权限
访问权限可以修饰 类、方法、属性等。
- open 和 public :允许实体被自己定义的模块中的任意源文件访问,也可以被另一模块的源文件通过导入该定义模块来访问。在指定框架的公共接口时,通常使用 open 或 public。
【演示】查看UIKIT源代码,里面的方法几乎都是public- internal:——不能出模块(项目)
允许实体被定义模块中的任意源文件访问,但不能被该模块之外的任何源文件访问。通常在定义应用程序或是框架的内部结构时使用。(默认级别)
【演示】随便创建一个类SecVC,可以在ViewController中访问到。- fileprivate——不能出当前源文件
将实体的使用限制于当前定义源文件中。
【演示】
//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 : ——不能出当前作用域
将实体的使用限制于封闭声明中,比fileprivate更严格。
【演示】
//在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 中的访问级别遵循一个基本原则:实体不能定义在具有更低访问级别(更严格)的实体中。
例如:
- 一个 public 的变量,其类型的访问级别不能是 internal,fileprivate 或是 private。因为无法保证变量的类型在使用变量的地方也具有访问权限。
- 函数的访问级别不能高于它的参数类型和返回类型的访问级别。因为这样就会出现函数可以在任何地方被访问,但是它的参数类型和返回类型却不可以的情况。