Swift访问控制权限

概述

Swift 3中,新增了 fileprivate 和 open 权限,而在Swift4 中,对 fileprivate 和 private 的访问范围做出了调整。访问控制限制你在不同源文件和 module 之前代码和代码之前的访问。这个特性让你可以隐藏一些代码的实现,和明确一些可以访问和使用的接口。

Modules 和 源文件

Swift 的访问控制模型是基于 module 和 源文件的。
一个 module 是一个独立的代码建造单元,例如一个 framework 或者 application 可以构建和包装成一个可以被其他 module 通过 Swift 的关键字 import 的单元。
一个源文件是在一个 module 里单独的 Swift 源码(或在 一个 app 或 framework 里的单独的文件) 。虽然常见的是在分开的源文件里定义单独的类型,但一个单独的源文件也能包含多个类型,方法等的定义。

访问级别

Swift 提供5个不同的访问级别,权限最高的是open,依次是 publicinternalfileprivate,最低的是private。默认使用的级别是 internal

open & public

使用 open 和 public 标记的实体在他们定义的 module 中的任意文件中都可以使用,并且在 import 了其定义的 module 的其他 module 的源文件中也能使用。一般在 framework 中指定公开的接口里使用 open 或者 public 级别。

open 和 public 的区别

  • 拥有 public 权限或者更低权限的类,只能在其定义的 module 中被子类化
  • 拥有 public 权限或者更低权限的类的成员,只能在其定义的 module 中被重写或子类化
  • 拥有open 权限的类可以在其定义和 import 的 module 中子类化
  • 拥有open 权限的类成员可以在其定义和 import 的 module 中被重写或子类化

internal

internal 修饰的实体在其定义 module 中的任意源文件中都可以访问,但是在其他 module 的任意源文件中都访问不了。一般在定义app 或者 framework 内部的结构的时候,使用 internal 级别。

fileprivate

fileprivate 限制了只能在其定义的源文件里面使用。使用 fileprivate 权限以隐藏其实现细节。当其只在整个源文件中使用的时候,使用 fileprivate 修饰。

private

private 访问权限限制其只能在定义的范围内,和其在同一文件中的 extension 中使用。当其只在当个声明中使用的时候,使用 private 修饰。

使用原则

子类: 子类的访问级别不能高于父类,但是子类复写的父类方法的访问级别可以高于父类
枚举: 枚举的每个值都和他们所属的枚举拥有相同的级别,并且并不能定义单独的访问级别。
协议: 你可以给协议指定访问级别,并且对于协议的每一项来说,访问级别都和协议相同。并且你不能单独给协议中单独的方法等定义不同的访问级别。

参考

Swift4 访问控制权限

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

推荐阅读更多精彩内容