Swift 访问控制
在本教程中,我们将通过实例了解 Swift 访问控制、类型以及如何使用它们。
在 Swift 中,访问控制用于设置类、结构、枚举、属性、方法、初始值设定项和子脚本的可访问性(可见性)。例如,
class Vehicle {
public func method1() {...}
private func method2() {...}
}
这里,
method1()
是public
公共的,即其他类可以访问它。method2()
是private
私有的,即其他类无法访问它。
注意关键字 public
和 private
。这些是 Swift 中的访问控制。
Swift 访问控制的类型
在 Swift 中,有 4 种访问控制:
控制 | 描述 |
---|---|
public | 声明可以从任何地方访问 |
private | 声明只能在定义的类或结构中访问 |
fileprivate | 声明只能在当前 swift 文件中访问 |
internal | 声明只能在定义的模块内访问(默认) |
public 公共访问控制
在 Swift 中,当方法、属性、类等被声明为公共时,我们可以从任何地方访问它们。
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
的类,它有两个公共数据成员:legCount
和 display()
。
然后,我们创建了一个名为 obj
的 Animal
类对象。然后,我们使用代码 obj1.legCount
和 obj1.display()
直接访问公共数据成员。
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
的类,该类具有属性名和方法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
,因此可以从源文件中定义数据成员的任何位置访问这些数据成员。
fileprivate
数据成员,将产生错误。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
是 internal
的,我们可以在类之外访问它,因为它们位于同一模块中。
如果我们在单个模块中使用 internal
,它的工作方式与 public
访问修饰符类似。
注意:
如果我们创建另一个模块并尝试访问内部数据成员,将产生错误。
要了解如何创建模块,请访问 Swift 模块。