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...

© 刘口子 2018-2025