Swift 访问控制

在本教程中,我们将通过实例了解 Swift 访问控制、类型以及如何使用它们。

在 Swift 中,访问控制用于设置类、结构、枚举、属性、方法、初始值设定项和子脚本的可访问性(可见性)。例如,

  1. class Vehicle {
  2. public func method1() {...}
  3. private func method2() {...}
  4. }

这里,

  • method1()public 公共的,即其他类可以访问它。

  • method2()private 私有的,即其他类无法访问它。

注意关键字 publicprivate。这些是 Swift 中的访问控制。


Swift 访问控制的类型

在 Swift 中,有 4 种访问控制:

控制 描述
public声明可以从任何地方访问
private 声明只能在定义的类或结构中访问
fileprivate声明只能在当前 swift 文件中访问
internal 声明只能在定义的模块内访问(默认)

public 公共访问控制

在 Swift 中,当方法、属性、类等被声明为公共时,我们可以从任何地方访问它们。

public 访问修饰符没有范围限制。例如,

  1. class Animal {
  2. // public property
  3. public var legCount: Int = 0
  4. // public method
  5. public func display() {
  6. print("I am an animal.");
  7. print("Total Legs:", legCount)
  8. }
  9. }
  10. // create an object
  11. var obj = Animal()
  12. // access and assign value to public property
  13. obj.legCount = 4
  14. // access the public method
  15. obj.display()

结果如下:

  1. I am an animal.
  2. Total Legs: 4

在上面的实例中,我们创建了一个名为 Animal 的类,它有两个公共数据成员:legCountdisplay()

然后,我们创建了一个名为 objAnimal 类对象。然后,我们使用代码 obj1.legCountobj1.display() 直接访问公共数据成员。


private 私有访问控制

当我们将类型成员声明为 private 时,它只能在同一个类或结构中访问。例如,

  1. class Student {
  2. // private property
  3. private var name = "Tim Cook"
  4. // private method
  5. private func display() {
  6. print("Hello from Student class")
  7. }
  8. }
  9. // create object of Student class
  10. var student1 = Student()
  11. // access name property
  12. print("Name:", student1.name)
  13. // access display() method
  14. student1.display()

在上面的实例中,我们创建了一个名为 Student 的类,该类具有属性名和方法display()。注意这些语句,

  1. // access name property
  2. print("Name:", student1.name)
  3. // access display() method
  4. student1.print();

由于 namedisplay() 被标记为 private,我们无法在 Student 外部访问它们。在这里,代码将生成以下错误。

  1. error: 'name' is inaccessible due to 'private' protection level
  2. error: 'display' is inaccessible due to 'private' protection level

fileprivate 访问控制

当我们将类型成员声明为 fileprivate 时,只能在定义的源文件中访问它。例如,

  1. class Student {
  2. // fileprivate property
  3. fileprivate var name = "Tim Cook"
  4. // fileprivate method
  5. fileprivate func display() {
  6. print("Hello from Student class")
  7. }
  8. }
  9. // create object of Student class
  10. var student1 = Student()
  11. // access name property
  12. print("Name:", student1.name)
  13. // access display method
  14. student1.display()

结果如下:

  1. Name: Tim Cook
  2. Hello from Student class

在上面的实例中,我们在 Student 类中创建了 fileprivate 数据成员 namedisplay()

由于 namedisplay() 标记为 fileprivate,因此可以从源文件中定义数据成员的任何位置访问这些数据成员。

注意:如果我们创建另一个 Swift 文件并尝试访问 fileprivate 数据成员,将产生错误。

internal 内部访问控制

当我们将类型或类型成员声明为内部时,只能在同一模块中访问它。

模块是类型(类、协议等)和资源(数据)的集合。它们被构建为协同工作并形成一个逻辑功能单元。

实例:同一模块内的内部
  1. class Student {
  2. // define internal property
  3. internal var name = "Tim Cook"
  4. }
  5. // create object of Student class
  6. var student1 = Student()
  7. // access name property
  8. print("Name:", student1.name)

结果如下:

  1. Name: Tim Cook

在上面的例子中,我们用属性名创建了一个名为 Student 的类。由于 nameinternal 的,我们可以在类之外访问它,因为它们位于同一模块中。

如果我们在单个模块中使用 internal,它的工作方式与 public 访问修饰符类似。

注意

如果我们创建另一个模块并尝试访问内部数据成员,将产生错误。

要了解如何创建模块,请访问 Swift 模块