[Swift3.0]访问控制open/public/internal/fileprivate/private

在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就会报错.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 访问控制能够限制你的代码从其他文件和模块中访问,这个特性能够让你隐藏你具体的实现,并且也可以让代码能够访问和使用。...
    China_ly阅读 347评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139
  • 突然看到一个弹窗(因为一位领导,全城屠狗)那一瞬间,心里五味杂陈! 几年前,为了完成家人的心愿单,它进入我们...
    苡牖阅读 114评论 0 0
  • 我记得这两年来,我所在公司的这条街上搬来了一个好大的公司,叫旺鑫,由于这个公司的人特别多,应该有好几千人,导致整条...
    灰姑娘玻璃鞋阅读 376评论 0 1