Swift(六 访问权限)

访问修饰符有: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

元组类型的访问级别遵循元组中字段最低级的访问级别

枚举类型的访问级别
枚举类型的访问级别继承自该枚举,因此我们不能为枚举中的成员指定访问级别。

你可能感兴趣的:(Swift(六 访问权限))