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

如果您是iOS / Swift开发的新手,则可能遇到过open关键字,只是问自己“这是怎么回事?”

了解这个奇怪关键字的用法可能会造成混淆,但是,在本文中,我将尝试介绍一个常见的用例,并希望解释它在现代Swift代码中的用途。

它是什么?

在Swift 3中引入后, open是比public更高(更宽松)的访问级别。

类型成员的访问级别被计算为该类型的真实访问级别和该成员声明的访问级别中的最小值。 如果班级是公开的,但成员是开放的,则真正的访问权限是公开的。

作为此规则的例外,属于公共类型的成员的开放类的真实访问级别是开放的。

简而言之,它“ 比公众更公开 ”。

但是,有什么比“公共”更公开的呢? 又为什么呢?

作为一种语言,Swift致力于子类化和覆盖,这是它的核心原则之一,但是,在设计框架时,鼓励开发人员投资于可覆盖性可能会付出一定的代价,因为设计用于子类化的类要比投入更多的精力。只是设计用于普通用途。

潜在地,另一个开发人员可能会出现,并且无私地改变类方法如何相互委派的行为。

这有可能破坏覆盖这些方法的后续子类。 在单个模块中,这样做的危险可以忽略不计,但是跨库边界,这可能会变得越来越成问题。

这是open关键字起作用的地方,它使开发人员可以区分公共可访问性公共可重写性,明确说明可供某人使用但不能扩展的公共内容。

让我们以下面的伪代码 为例

如果该类在其自己的模块中声明, 在这种情况下, 让我们想象它是一个身份验证库,任何其他尝试对其进行子类化的代码都可以从Auth继承,因为它具有open关键字。

然后,子类可以覆盖login方法,因为该方法也被标记为open -请注意,不过resetPass方法使用的是public关键字。 可以显式设置此方法的访问级别,因为它可以被调用,但是不能更改

open关键字是防止开发人员意外覆盖核心功能的一种优雅而简单的方法,这对于您的库的工作至关重要。

tl:dr?

  • 一个open类是可访问的并且可以被子类化
  • open班级成员可访问且可重写
  • 可以访问public类,但不能将其子类化
  • public班级成员可以访问但不能覆盖

随时在下面的评论中留下任何问题🙂