Swift 中的 'open' 关键字是什么?


在 Swift 中,我们有三个关键字——`open`、`public` 和 `final`。这三个词具有不同的属性,有助于我们理解代码是否可以扩展到另一个模块,从而使代码易于重用。本文将学习这些关键字的属性。

示例

这是一个在类定义中使用 `open` 关键字的示例

import Foundation
open class Person {
   var firstName: String?
   var lastName: String?
   var age: Int?
   var address: String?
}
class Student: Person {
   var school: String?
   var grade: Int?
   var score: Double?
}

在这个例子中,`Person` 被定义为 `open`,这意味着它可以被子类化。`Student` 是 `Person` 类的子类,能够继承其属性和方法。

如果我们将 `open` 关键字改为 `final`

import Foundation
final class Person {
   var firstName: String?
   var lastName: String?
   var age: Int?
   var address: String?
}
class Student: Person {
   var school: String?
   var grade: Int?
   var score: Double?
}

`Person` 现在被定义为 `final`,这意味着它不能被子类化。这将在 `Student` 中导致编译时错误。

值得注意的是,Swift 中类的默认行为是 `final`,因此如果您希望一个类能够被子类化,则必须显式使用 `open` 关键字。

您也可以将 `open` 关键字与结构体和协议一起使用,并且会得到与类相同的行为。

了解 `open` 和 `final` 之间的区别以及 `open` 和 `public` 之间的区别非常重要。

`open` 和 `final` 之间的区别是什么?

`open` 访问权限可用于类、结构体或协议。当您使用 `open` 时,它表示您可以通过同一模块中的其他类、结构体或协议,或其他模块来创建子类或扩展。它有助于使您的代码更灵活和可重用。此概念有助于实现面向对象编程的概念。

另一方面,`final` 关键字表示类、结构体或协议不能被扩展或子类化。当您想要保护您的代码并且不想提供代码重用的灵活性时,`final` 关键字是一个不错的选择。这意味着如果一个类是 `final` 的,则您不能创建它的子类。

以下是这两个关键字差异的总结:

Swift 中的 `open` 与 `final`

关键字 访问权限 可重写性
open 可访问的 可重写的
final 可访问的 不可重写的

`final` 关键字确保类、结构体或协议不会被子类或扩展更改。基本上,这有助于改进代码优化。此外,编译器不需要处理类、结构体或协议的可扩展性,因为它们是最终的。最后,它提高了应用程序的整体性能。

简而言之,`open` 允许扩展和子类化,而 `final` 则阻止它。

`open` 和 `public` 之间的区别是什么?

`open` 访问权限可用于类、结构体或协议。当您使用 `open` 时,它表示您可以通过同一模块中的其他类、结构体或协议,或其他模块来创建子类或扩展。您的代码变得更灵活,可以重用。

`public` 关键字的属性是指示同一模块或其他模块(导入同一模块)中的其他代码可以访问或使用类、结构体甚至协议。

以下是这两个关键字差异的总结:

Swift 中的 `open` 与 `public`

关键字 访问权限 可重写性 子类化
open 可在任何模块中访问 可重写的 允许
public 可在任何模块中访问 不可重写的 不允许

结论

在本文中,我们发现我们可以将所有三个访问权限用于不同的目的,如下所示:

`open` 关键字 - 它可以被任何模块访问,它是可重写的,并且允许子类化。

`public` 关键字 - 任何模块都可以访问它,但它不可重写,并且根本不允许子类化。

`final` 关键字 - 它不能被扩展甚至子类化。

如果您想完全保护您的代码,则应选择 `final` 关键字。

更新于:2023年2月28日

2000+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.