在 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 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
数据成员:legCount 和 display()
。
然后我们创建了一个名为 obj 的 Animal
类对象。然后我们通过代码 obj1.legCount
和 obj1.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();
由于 name 和 display()
被标记为 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
数据成员 name 和 display()
。
由于 name 和 display()
被标记为 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。由于 name 是 internal
,我们可以在类外部访问它,因为它们在同一个模块中。
如果我们使用同一模块内的 internal
,它的作用与 public
访问修饰符相同。
注意:
- 如果我们创建另一个模块并尝试访问
internal
数据成员,我们将收到一个错误。 - 要了解如何创建模块,请访问 Swift 模块。