Swift中的访问控制
- 访问控制概念:Swift 中的访问控制是用来限制类、结构体、枚举等元素的可见性和可访问性,例如通过关键字
public
和private
控制。 - 访问控制类型:Swift 提供四种访问控制级别:
public
(任何地方可访问)、private
(仅在定义的类或结构体内访问)、fileprivate
(仅在同一源文件内访问)和internal
(仅在同一模块内访问,默认级别)。 - 使用示例:例如,通过将方法或属性声明为
private
,可以限制其只能在定义它的类或结构体内部访问,而将其声明为public
则允许在任何地方访问。
在 Swift 中,访问控制用于设置类、结构体、枚举、属性、方法、初始化器和下标的可访问性(可见性)。例如,
class Vehicle {
public func method1() {...}
private func method2() {...}
}
在这里,
method1()
是public
的,即它可以被其他类访问。method2()
是private
的,即它不能被其他类访问。
注意关键词 public
和 private
。这些是 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
数据成员:legCount
和 display()
。
然后,我们创建了一个名为 obj
的 Animal
类的对象。接着,我们通过使用代码 obj.legCount
和 obj.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();
由于 name
和 display()
被标记为 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
数据成员 name
和 display()
。
由于 name
和 display()
被标记为 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
。由于 name
是 internal
的,我们可以在类外部访问它,因为它们位于同一个模块中。
如果我们在单个模块内使用 internal
,它就像 public
访问修饰符一样工作。
注意:
- 如果我们在另一个模块中尝试访问
internal
数据成员,我们将得到一个错误。 - 要了解如何创建模块,请访问 Swift Module。