在swift3.0中,用于访问控制的关键字一共有五个:
- open : 可以被任何人访问,包括override和继承
- public : 可以被任何人访问,但是在其他module中不能override和被继承
- interal : 默认访问级别,在整个模块内都可以被访问
- fileprivate : 其修饰的属性或方法,只能在本文件内( 即同一个.swift文件,一个文件内可以定义多个类 )访问使用;
- private : 其修饰的属性或方法,只能在本类(即:在最外面的{})内可使用,或访问.
其访问权限,从上到下,逐次降低!!
private 和 fileprivate
这两个都可以防止文件外引用,但是还是有些差别的,所以在一起说,方便比较其区别:

如图中示例:
定义了两个类A和B,其中A中有两个方法,分别使用private和fileprivate修饰;然后在类B中的方法中创建了A的实例,分别调用这两个方法,就会发现,在调用funcA1的时候,就会报错,调用funcA2没有问题;
当B继承自A时,结果是一样的:

当A和B分处不同文件时,这两个方法都不能访问了:

internal
默认的访问级别,internal修饰符可写可不写
关于internal关键字,解释起来有点绕:
internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。
如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。
如果是App代码,也是在整个App代码,也是在整个App内部可以访问。
其实在一般我们做项目时,都属于是整个App代码,不同类之间可以相互访问,如果把上面最后的示例中,类A的方法修饰词去掉,即使用internal,就不会报错了;
public
- 使用public修饰的类,属性或方法,可以被任何类访问,
- 但在其他的module中不可以被override和继承,而在本module可以;
module外是指需要使用import引入其文件才能使用,在不需要使用import引入文件就可以创建类对象,就属于在同一个module内;
open
- 可以被任何人使用,
- 也可以被override和继承,这是和public的区别
1. open与public的共同点
其实,在我们建立的playground项目中,在Sources文件夹下的文件和我们测试代码的文件是分属不同的模块的,即下面的两个红框:

playground创建时,只有上面红框的文件,Sources文件夹是空的;
如果我们在这里创建A的对象,就会报错:

这时,我们要对A类进行如下修改:

使用了public修饰,但是,这时会有另外一个错误:

是说A的初始化方法是internal的,只需要在其初始化方法前也用public修饰即可,最后的A类是这样的:

创建就不会报错了;
但是A中的方法,都不能访问,只有使用public修饰的才能访问;
以上的** public** 用 open 修饰,效果是一样的,适用于类,方法和属性,这是** public** 和** open** 的共同点
2. open和public区别
上面提到使用public修饰的类不能被继承,方法和属性不能被重写,而使用open修饰的则可以:
现在我们的A类使用public修饰的,那么,我们创建一个类C继承自A:

报错了;
下面我们将A改为open修饰:

上面的错误就消失了;
这就是使用public修饰的类不能被继承,而使用open 的则可以;
除了这点还有,public修饰的不能override,即上面A中的方法funcA3不能被重写;
下面,我们在C中重写这两个方法:

重写func4的时候没问题,而重写funcA3就会报错.
网友评论