Swift 4 / Swift 5正如Swift文档中提到的- 访问控制,Swift有5个访问控制:open和 public:可以从模块的实体和导入定义模块的任何模块实体访问。internal:只能从其模块的实体访问。这是默认的访问级别。fileprivate和 private:只能在您定义它们的有限范围内限制访问。开放和公共有什么区别?open与以前版本的Swift中的public相同,它们允许来自其他模块的类使用和继承它们,即:它们可以从其他模块中继承。此外,它们允许来自其他模块的成员使用和覆盖它们。他们的模块也采用相同的逻辑。public允许来自其他模块的类使用它们,但不能继承它们,即:它们不能从其他模块中继承。此外,它们允许来自其他模块的成员使用它们,但不要覆盖它们。对于他们的模块,它们具有相同的开放逻辑(它们允许类使用和继承它们;它们允许成员使用和覆盖它们)。fileprivate和private有什么区别?fileprivate可以从他们的整个文件中访问。private只能从它们的单个声明和同一文件中的声明的扩展名进行访问; 例如:// Declaring "A" class that has the two types of "private" and "fileprivate":class A { private var aPrivate: String? fileprivate var aFileprivate: String? func accessMySelf() { // this works fine self.aPrivate = "" self.aFileprivate = "" }}// Declaring "B" for checking the abiltiy of accessing "A" class:class B { func accessA() { // create an instance of "A" class let aObject = A() // Error! this is NOT accessable... aObject.aPrivate = "I CANNOT set a value for it!" // this works fine aObject.aFileprivate = "I CAN set a value for it!" }}Swift 3和Swift 4 Access Control有什么区别?正如SE-0169提案中所提到的,Swift 4中唯一的改进是私有访问控制范围已扩展为可以从同一文件中的声明扩展访问; 例如:struct MyStruct { private let myMessage = "Hello World"}extension MyStruct { func printMyMessage() { print(myMessage) // In Swift 3, you will get a compile time error: // error: 'myMessage' is inaccessible due to 'private' protection level // In Swift 4 it should works fine! }}所以,没有必要宣布myMessage为fileprivate是在整个文件进行访问。