0%

关于 private, fileprivate, internal, public, open 关键字的用法

基本

  • 可以修饰类、结构体等类型,也可以修饰其中的属性、方法等,包括构造方法;
  • 从最隐私到最开放的顺序是 private, fileprivate, internal, public, open;

下面的讲解都以类为例。

private

只能在当前类中访问,即时同一个类的 class 和 extension 中也不能相互访问;这和 OC 不一样,OC 中其实没有真正的私有属性或方法,通过运行时都可以访问到,而 Swift 中私有就是真的私有了。

1
Swift 4 中更新为,在同一个类的 class 和 extension 中可以访问,结构体等也类似。

fileprivate

可以在当前 swift 文件中访问,即便是不同的类。

internal

默认关键字,写不写效果是一样的;可以在当前 module(模块)中访问,也就是说文件直接不需要 import 的时候,可以相互访问;我们通常给类设置其他类可以访问到的属性或方法的时候,就说此关键字,可以不写。

public

和 internal 相比,可以被任何人访问,也就是说不在一个 module 中也是可以访问,但是不能 override 或者继承。

需要注意的是:
fileprivate, internal, open 在可访问的范围内都是可以被 override 或者继承的;
private 由于只能在自己大括号作用域中被访问,没有 override 或继承一说,而 public 只能被外界拿到却不能 override 或者继承是其和 open 的唯一差别;

open

拥有最大开放度,可以被任何人访问,并且可以被 override 和继承。