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 propertypublic var legCount: Int = 0// public methodpublic func display() {print("I am an animal.");print("Total Legs:", legCount)}}// create an objectvar obj = Animal()// access and assign value to public propertyobj.legCount = 4// access the public methodobj.display()
结果如下:
I am an animal.Total Legs: 4
在上面的实例中,我们创建了一个名为 Animal 的类,它有两个公共数据成员:legCount 和 display()。
然后,我们创建了一个名为 obj 的 Animal 类对象。然后,我们使用代码 obj1.legCount 和 obj1.display() 直接访问公共数据成员。
private 私有访问控制
当我们将类型成员声明为 private 时,它只能在同一个类或结构中访问。例如,
class Student {// private propertyprivate var name = "Tim Cook"// private methodprivate func display() {print("Hello from Student class")}}// create object of Student classvar student1 = Student()// access name propertyprint("Name:", student1.name)// access display() methodstudent1.display()
在上面的实例中,我们创建了一个名为 Student 的类,该类具有属性名和方法display()。注意这些语句,
// access name propertyprint("Name:", student1.name)// access display() methodstudent1.print();
由于 name 和 display() 被标记为 private,我们无法在 Student 外部访问它们。在这里,代码将生成以下错误。
error: 'name' is inaccessible due to 'private' protection levelerror: 'display' is inaccessible due to 'private' protection level
fileprivate 访问控制
当我们将类型成员声明为 fileprivate 时,只能在定义的源文件中访问它。例如,
class Student {// fileprivate propertyfileprivate var name = "Tim Cook"// fileprivate methodfileprivate func display() {print("Hello from Student class")}}// create object of Student classvar student1 = Student()// access name propertyprint("Name:", student1.name)// access display methodstudent1.display()
结果如下:
Name: Tim CookHello from Student class
在上面的实例中,我们在 Student 类中创建了 fileprivate 数据成员 name 和 display()。
由于 name 和 display() 标记为 fileprivate,因此可以从源文件中定义数据成员的任何位置访问这些数据成员。
fileprivate 数据成员,将产生错误。internal 内部访问控制
当我们将类型或类型成员声明为内部时,只能在同一模块中访问它。
模块是类型(类、协议等)和资源(数据)的集合。它们被构建为协同工作并形成一个逻辑功能单元。
实例:同一模块内的内部
class Student {// define internal propertyinternal var name = "Tim Cook"}// create object of Student classvar student1 = Student()// access name propertyprint("Name:", student1.name)
结果如下:
Name: Tim Cook
在上面的例子中,我们用属性名创建了一个名为 Student 的类。由于 name 是 internal 的,我们可以在类之外访问它,因为它们位于同一模块中。
如果我们在单个模块中使用 internal,它的工作方式与 public 访问修饰符类似。
注意:
如果我们创建另一个模块并尝试访问内部数据成员,将产生错误。
要了解如何创建模块,请访问 Swift 模块。