iOS Swift No.26 - 访问控制1

第二十六章 访问控制swift的访问控制模型(model)是基于模块(modules)和源文件(source files)的概念而来的。模块是一个独立的代码单元。框架(framework)或应用程序(application)会作为一个独立的模块来构建和发布,在swift中可以用关键字`import`来导入另一个模块。在Xcode中用swift创建的每一个目标(app bundle,framework)都可以被看作是独立的模块来处理。如果我们把app中的代码组合在一起看作为一个独立的框架,当然
摘要由CSDN通过智能技术生成

第二十六章 访问控制

访问控制可以约束或限制我们自己的代码被来自其他源文件中的代码所访问,该特征可以使我们隐藏代码的实现细节,并且为其他可以访问和使用的代码提供接口。

我们可以为单个类型(类,结构体和枚举)分配特殊的访问级别,就像属性,方法,构造器和下表属于这些类型那样。协议可以被限定在相关的上下文之中使用,包括协议里的全局常量,变量和函数。

除了提供一些访问级别外,swift还为某些典型场景提供了默认的访问级别,这样就不需要我们在每段代码中都申明显式的访问级别。其实,如果只是开发一个单一目标的app,我们完全可以不用显式声明代码的访问级别。
在这里插入图片描述

1. Modules and Source Files (模块和源文件)

swift的访问控制模型(model)是基于模块(modules)和源文件(source files)的概念而来的。

模块是一个独立的代码单元。框架(framework)或应用程序(application)会作为一个独立的模块来构建和发布,在swift中可以用关键字import来导入另一个模块。

在Xcode中用swift创建的每一个目标(app bundle,framework)都可以被看作是独立的模块来处理。如果我们把app中的代码组合在一起看作为一个独立的框架,当然很有可能我们将会把该框架重复穿插使用在多个应用程序中。然后我们在该框架内定义的所用东西将会成为一个独立的模块,当该框架被导入和使用在一个应用程序中。或者是我们将该框架使用在另一框架里。

源文件就是 Swift 中的源代码文件,它通常属于一个模块,即一个应用程序或者框架,尽管我们一般会将不同的 类型分别定义在不同的源文件中,但是同一个源文件也可以包含多个类型、函数之类的定义。

2. Access Levels (访问级别)

swift为代码的实体提供了五种不同的访问级别,这些访问级别不仅与源文件中定义的实体相关,同时也与源文件所属的模块相关。

  • 开放访问和公共访问允许任何实体可以被使用在来自于模块中的任意源代码文件。通常情况下当我们指明了公共接口和框架之后可以使用开放和公共访问。两者之间的不同在下面有详细描述。
  • 内部访问允许任何实体可以被使用在来自于模块中的任意源代码文件。但不可使用该模块以外的其他源代码文件,通常情况下我们定义好一个App或框架的内部结构后才可以使用内部访问。
  • 文件私有访问限制了其定义的源文件内的实体使用权。使用文件私有访问当我们想要隐藏某段代码或功能的实现细节。当我们在整个文件中使用了这些实现细节。
  • 私有访问限制了其实体只能在所定义的作用域内使用。需要把这些细节被整个作用域使用的时候,使用文件私有访问隐藏了一些特定功能的实现细节。

开放访问是最高的(限制最少)访问级别和私有访问是最低的(限制最多)访问级别。

开放访问只能应用在类和类的成员,并且它不同于公共访问,公共访问允许子类和重写的模块外的代码,在下面的子类中有详细描述。把一个类标记为开放,显式地表明,你认为其他模块中的代码使用此类作为父类,然后你已经设计好了你的类的代码了。

2.1 Guiding Principle of Access Levels (访问级别的原则)

swift中的访问级别只遵守一个原则:不可将一个实例定义在比它访问级别更低(限制最多)的实例中。

例如:

  1. 一个公共变量不可以被定义为一个内部的,文件私有的,或私有的类型。是因为这些类型可能在公共变量使用的地方是无效的。
    A public variable can’t be defined as having an internal, file-private, or private type, because the type might not be available everywhere that the public variable is used
  2. 一个函数可能比它的参数类型和返回类型拥有一个更高级的访问级别。因为函数可以被用在其组成类型对周围代码是无效的地方的这种情况下。
    A function can’t have a higher access level than its parameter types and return type, because the function could be used in situations where its constituent types are unavailable to the surrounding code.

关于此原则的各种情况的具体实现,将在下面的细节中体现。

2.2 Default Access Levels (默认访问级别)

一个在我们代码中的实体(特例另说)有一个内部访问的级别,如果我们并没有指出明确的访问级别。因此在大多是例子中,我们不必指出明确的访问级别。

2.3 Access Levels for Single-Target Apps (单目标的app访问级别)

如果我们写了一个简易的单目标app,通常在我们app中的代码都是自包含的代码,所以不需要提供模块外使用。代码内部的默认访问级别刚好满足该需求。因此,我们并不用指明自定义的访问级别即可。但是,你也可以使用文件私有访问或私有访问级别,用于隐藏一些功能的实现细节。

2.4 Access Levels for Frameworks (框架的访问级别)

当我们开发一个框架,可以将一些给框架对外的接口(public-facing interface)标记为开放或公开的访问级别。那么这样就可以被其他模块访问和查看。比如该app导入了该框架。该对外的接口就是我们经常所谈论的Public Programming Interface或APL。
在这里插入图片描述

2.5 Access Levels for Unit Test Target (单元测试目标的访问级别)

当我们写一个带有单元测试目标的app时,app中的代码需要提供该该模块才能被测试,默认情况下,只有被标记为开放或公共的的实体才能被其他模块访问。然而,单元测试目标可以访问任何一个内部实体,如果在导入应用程序模块的语句前使用@testable特性,然后在允许测试的编译设置( Build Options -> Enable Testability )下编译这个应用程序模块,单元测试目标就可以访问应用程序模块中所有内部级别的实体了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值