跳到主要内容

Swift中的访问控制

提示
  1. 访问控制概念:Swift 中的访问控制是用来限制类、结构体、枚举等元素的可见性和可访问性,例如通过关键字 publicprivate 控制。
  2. 访问控制类型:Swift 提供四种访问控制级别:public(任何地方可访问)、private(仅在定义的类或结构体内访问)、fileprivate(仅在同一源文件内访问)和 internal(仅在同一模块内访问,默认级别)。
  3. 使用示例:例如,通过将方法或属性声明为 private,可以限制其只能在定义它的类或结构体内部访问,而将其声明为 public 则允许在任何地方访问。

在 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 属性
public var legCount: Int = 0

// public 方法
public func display() {
print("我是一只动物。");
print("腿的总数:", legCount)
}
}

// 创建对象
var obj = Animal()

// 访问并赋值给 public 属性
obj.legCount = 4

// 访问 public 方法
obj.display()

输出

我是一只动物。
腿的总数: 4

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

然后,我们创建了一个名为 objAnimal 类的对象。接着,我们通过使用代码 obj.legCountobj.display() 直接访问 public 数据成员。

private 访问控制

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

class Student {

// private 属性
private var name = "Tim Cook"

// private 方法
private func display() {
print("来自 Student 类的问候")
}
}

// 创建 Student 类的对象
var student1 = Student()

// 访问 name 属性
print("姓名:", student1.name)

// 访问 display() 方法
student1.display()

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

// 访问 name 属性
print("姓名:", student1.name)

// 访问 display() 方法
student1.display();

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

error: 'name' 由于 'private' 保护级别而无法访问
error: 'display' 由于 'private' 保护级别而无法访问

fileprivate 访问控制

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

class Student {

// fileprivate 属性
fileprivate var name = "Tim Cook"

// fileprivate 方法
fileprivate func display() {
print("来自 Student 类的问候")
}
}

// 创建 Student 类的对象
var student1 = Student()

// 访问 name 属性
print("姓名:", student1.name)

// 访问 display 方法
student1.display()

输出

姓名: Tim Cook
来自 Student 类的问候

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

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

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

internal 访问控制

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

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

示例:同一模块内的 internal

class Student {

// 定义 internal 属性
internal var name = "Tim Cook"
}

// 创建 Student 类的对象
var student1 = Student()

// 访问 name 属性
print("姓名:", student1.name)

输出

姓名: Tim Cook

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

如果我们在单个模块内使用 internal,它就像 public 访问修饰符一样工作。

注意

  • 如果我们在另一个模块中尝试访问 internal 数据成员,我们将得到一个错误。
  • 要了解如何创建模块,请访问 Swift Module