美文网首页
[Swift3.0]访问控制open/public/intern

[Swift3.0]访问控制open/public/intern

作者: 流火绯瞳 | 来源:发表于2016-11-02 15:11 被阅读164次

在swift3.0中,用于访问控制的关键字一共有五个:

  • open : 可以被任何人访问,包括override和继承
  • public : 可以被任何人访问,但是在其他module中不能override和被继承
  • interal : 默认访问级别,在整个模块内都可以被访问
  • fileprivate : 其修饰的属性或方法,只能在本文件内( 即同一个.swift文件,一个文件内可以定义多个类 )访问使用;
  • private : 其修饰的属性或方法,只能在本类(即:在最外面的{})内可使用,或访问.
其访问权限,从上到下,逐次降低!!

private 和 fileprivate

这两个都可以防止文件外引用,但是还是有些差别的,所以在一起说,方便比较其区别:


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

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

不同文件

internal

默认的访问级别,internal修饰符可写可不写
关于internal关键字,解释起来有点绕:

internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。
如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。
如果是App代码,也是在整个App代码,也是在整个App内部可以访问。

其实在一般我们做项目时,都属于是整个App代码,不同类之间可以相互访问,如果把上面最后的示例中,类A的方法修饰词去掉,即使用internal,就不会报错了;

public

  1. 使用public修饰的类,属性或方法,可以被任何类访问,
  1. 但在其他的module中不可以被override和继承,而在本module可以;

module外是指需要使用import引入其文件才能使用,在不需要使用import引入文件就可以创建类对象,就属于在同一个module内;

open

  1. 可以被任何人使用,
  1. 也可以被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修饰: open

上面的错误就消失了;

这就是使用public修饰的类不能被继承,而使用open 的则可以;

除了这点还有,public修饰的不能override,即上面A中的方法funcA3不能被重写;
下面,我们在C中重写这两个方法:

override

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

相关文章

网友评论

      本文标题:[Swift3.0]访问控制open/public/intern

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