Swift 访问控制

在 Swift 中,访问控制用于设置类、结构体、枚举、属性、方法、初始化器和下标的可访问性(可见性)。例如,

class Vehicle {

  public func method1() {...}
  private func method2() {...}
}

这里,

  1. method1()public,即它可以被其他类访问。
  2. method2()private,即它不能被其他类访问。

请注意关键字 publicprivate。它们是 Swift 中的访问控制。


Swift 访问控制的类型

在 Swift 中,有四种访问控制

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

public 访问控制

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

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

class Animal {

// public property public var legCount: Int = 0 // public method public func display() { print("I am an animal."); print("Total Legs:", legCount) }
} // create an object var obj = Animal() // access and assign value to public property obj.legCount = 4 // access the public method obj.display()

输出

I am an animal.
Total Legs: 4

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

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


private 访问控制

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

class Student {

// private property private var name = "Tim Cook" // private method private func display() { print("Hello from Student class") }
} // create object of Student class var student1 = Student() // access name property print("Name:", student1.name) // access display() method student1.display()

在上面的示例中,我们创建了一个名为 Student 的类,其中包含一个属性 name 和一个方法 display()。请注意这些语句:

// access name property
print("Name:", student1.name)

// access display() method
student1.print();

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

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

fileprivate 访问控制

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

class Student {

// fileprivate property fileprivate var name = "Tim Cook" // fileprivate method fileprivate func display() { print("Hello from Student class") } }
// create object of Student class var student1 = Student() // access name property print("Name:", student1.name) // access display method student1.display()

输出

Name: Tim Cook
Hello from Student class

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

由于 namedisplay() 被标记为 fileprivate,这些数据成员在定义它们的源文件中的任何地方都可以访问。

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


internal 访问控制

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

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


示例:同一模块内的 internal

class Student {

// define internal property internal var name = "Tim Cook"
} // create object of Student class var student1 = Student() // access name property print("Name:", student1.name)

输出

Name: Tim Cook

在上面的示例中,我们创建了一个名为 Student 的类,其中包含一个属性 name。由于 nameinternal,我们可以在类外部访问它,因为它们在同一个模块中。

如果我们使用同一模块内的 internal,它的作用与 public 访问修饰符相同。

注意:

  • 如果我们创建另一个模块并尝试访问 internal 数据成员,我们将收到一个错误。
  • 要了解如何创建模块,请访问 Swift 模块
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战