Swift 的访问权限控制
status
category
date
summary
slug
icon
tags
password
熟悉了Java中的private、protected和public,在Swift中第一次见到internal时着实感到困惑,在了解了private的特殊之处后也有些震惊,就通过此文记录一下相关知识点。
参考:The Swift Programming Language版本:Swift 5.1
Swift的访问权限管理依赖于两个概念:module和文件。(说模块实在是太别扭了)module值得是一个完整的代码单元,它可以是一个或多个框架(Framework),或者是一个App Bundle,可以被import导入到工程中。文件指的就是
Swift File
,它通常属于一个module。Swift提供了三种访问权限的级别:
public
:开放权限,相同和不同的module或应用都可以访问
internal
:内部权限,同时也是默认的级别,当前module或应用可以访问,但外部不能访问
private
:私有权限,只有当前源文件可以访问
有一点要特别说明的是,Swift中的
private
和其他大部分语言不一样,它的限制范围是文件,而不是类型。在Java中,如果某个类的属性声明为private
,那么只有这个类内部能够访问。但在Swift中,即使两个毫不相关的类,只要被写在同一个文件中,那么这个文件里的private
属性或函数都可以被访问到。以属性举例,在类中声明的属性默认如下:
因为没有任何修饰,所以访问权限默认是
internal
,即同一module
下任意类和文件都可以访问到Person
实例和name
属性。如果希望name
仅在当前文件中可访问,可以使用private
修饰:但是在开发中遇到的最多情况,应该是希望外部可以读取,但不可以修改。这也是为了保证类型的封装和安全,在内部提供可读可写,而外部仅仅可读。我们可以通过下面这种写法把读写权限分开:
这种写法相当于把
setter
设置为private
,而getter
仍然是默认的internal
。如果既想要外部可读,又想仅内部可写,可以为getter
加上public
:Loading...