美文网首页
Access Control

Access Control

作者: 夜雨聲煩_ | 来源:发表于2018-01-25 16:49 被阅读0次

概念

  • 访问控制主要应用于封装代码对于多个工程的复用
  • 访问等级由高到低分为五个,等级越高限制越少
    1.open:本工程和其他Import该工程的工程可用。open只应用于类和类成员,使用open可以在本工程和其他Import该工程的工程使用子类和重写方法
    2.public:同上,区别在于只能在本工程使用子类和重写方法,不能再其他工程
    3.internal:只能用于其定义工程
    4.file-private:只能用于源文件,隐藏具体实现内容
    5.private:用于某一单一声明,隐藏具体实现内容

private与file-private的区别

  • private 当前文件当前类中
  • fileprivate 当前文件即可,不用当前类型。(同一文件多个类)

其他

  • 不能将被某一实体所包含的实体定义为更高的访问等级,例如:
    1.不能将属性定义为public,而将type定义为internal等
    2.不能将方法定义为internal,而将参数返回值定义为private等
  • 大部分情况下不需要自己定义,默认为Internal的访问等级
  • 对于Single-Target App默认为Internal的访问等级,不需要额外定义,只需要在需要的地方声明private隐藏实现即可。(普通APP均为Single-Target可以使用多个target来实现大部分功能相同,个别功能不同的多个app,如滴滴司机版乘客版等)
  • 由于默认的Internal不能用于其他target,所以对于unit test,要使用open或public来标记类。或者使用@testable来标记需要被测试的部分
  • 对于类,将类定义的访问等级将会自动用于类的属性方法,例如定义了private的类,则它的属性方法默认为private。但是public对应的members默认为internal
  • 对于元组,没有像类和结构体那样的独立定义访问等级的地方。而是根据其中元素隐式得到,如果其中元素等级不同时,取较低者。例如一个元素为Internal一个为private,则元组为private
    -对于函数,类似于元组,取较低者。同时在显示声明函数的访问等级,且与参数返回值所取等级一致,否则无法编译通过
  • 对于枚举,枚举定义直接应用于枚举值。例如枚举定义为public,则枚举值默认隐式为public
  • 对于内嵌类型,访问等级和外部一致。但是对于外部是public时内嵌类型为internal,如果想内嵌类型也为public则需要显式定义
  • 子类继承父类时,不可超过父类的访问等级。但是子类重写的父类方法,可以超过父类被重写方法的访问等级。同时子类方法可以调用父类中低于该子类方法的方法
  • getter和setter。
    struct TrackedString {
      private(set) var numberOfEdits = 0
      var value: String = "" {
          didSet {
              numberOfEdits += 1
          }
      }
    }
    
    numberOfEdits属性的读方法默认为internal,即函数外可读。写方法定义为private,即函数内可写,函数外不可写。
  • 对于协议,定义类型访问等级与协议内容访问等级一致。例如协议定义为public,则其中必要方法等也为public,这与其他类型不同。其他类型中定义为public,members为internal

相关文章

网友评论

      本文标题:Access Control

      本文链接:https://www.haomeiwen.com/subject/amayaxtx.html