访问控制解析
简介:
和其他高级语言一样Swift中也增加了访问控制,在Swift中提供了private、internal、public三种访问级别,但是不同的是Swift中的访问级别是基于模块(module,或者target)和源文件(.swift文件)的,而不是基于类型、命名空间声明。
1.相关概念
模块
指的是独立的代码单元,框架或应用程序会作为一个独立的模块来构建和发布。在 Swift 中,一个模块可以使用 import 关键字导入另外一个模块。实体
:对于代码中可以设置访问级别的特性(属性、基本类型、函数等),称之为实体
。源文件
就是 Swift 中的源代码文件,它通常属于一个模块
,即一个应用程序或者框架。尽管我们一般会将不同的类型分别定义在不同的源文件中,但是同一个源文件也可以包含多个类型、函数之类的定义。
2.关键字介绍
public
:可以访问同一模块源文件中的任何实体,在模块外也可以通过导入该模块来访问源文件里的所有实体。通常情况下,框架中的某个接口可以被任何人使用时,你可以将其设置为 public 级别。
(在模块内部和外部都可以使用
)internal
:可以访问同一模块源文件中的任何实体,但是不能从模块外访问该模块源文件中的实体。通常情况下,某个接口只在应用程序或框架内部使用时,你可以将其设置为 internal 级别。
(模块内部使用, 应用程序或者框架内部
)private
:限制实体只能在所在的源文件内部使用。使用 private 级别可以隐藏某些功能的实现细节。
(只能在当前源文件中使用
)
- 注意:Swift 中的 private 访问级别不同于其他语言,它的范围限于源文件,而不是声明范围内
3.使用注意:
- 1> public 为最高(限制最少)访问级别,private 为最低(限制最多)访问级别。
- 2> Swift 中的访问级别遵循一个基本原则:
不可以在某个实体中定义访问级别更高的实体
。
一个类型的访问级别也会影响到类型成员(属性、方法、构造器、下标)的默认访问级别。
如果你将类型指定为 private 级别,那么该类型的所有成员的默认访问级别也会变成 private。
如果你将类型指定为 public 或者 internal 级别(或者不明确指定访问级别,而使用默认的 internal 访问级别),那么该类型的所有成员的默认访问级别将是 internal。
上面提到,一个 public 类型的所有成员的访问级别默认为 internal 级别,而不是 public 级别。
如果你想将某个成员指定为 public 级别,那么你必须
显式指定
。这样做的好处是,在你定义公共接口的时候,可以明确地选择哪些接口是需要公开的,哪些是内部使用的,避免不小心将内部使用的接口公开。
练习:
public class SomePublicClass { // 显式的 public 类
public var somePublicProperty = 0 // 显式的 public 类成员
var someInternalProperty = 0 // 隐式的 internal 类成员
private func somePrivateMethod() {} // 显式的 private 类成员
}
class SomeInternalClass { // 隐式的 internal 类
var someInternalProperty = 0 // 隐式的 internal 类成员
private func somePrivateMethod() {} // 显式的 private 类成员
}
private class SomePrivateClass { // 显式的 private 类
var somePrivateProperty = 0 // 隐式的 private 类成员
func somePrivateMethod() {} // 隐式的 private 类成员
}