快速提示:访问控制

在您的应用程序上下文中,将所有可以为应用程序其他部分提供信息或功能的信息视为API会很有帮助。 访问控制是一个功能强大的抽象工具,它使您可以隐藏实现细节并控制外界如何使用您的API。 例如,如果应用程序的另一部分“不需要知道”某些信息或功能,则可以(并且应该)将其隐藏。 精心设计的API不仅使您感到愉悦,而且还可以防止滥用和程序员错误。

注意:访问控制是围绕模块和源文件的概念构建的。 模块是不同的代码分发单元,例如应用程序或框架。

有五个访问级别:

  • private限制对同一文件中的封闭声明及其扩展名的访问。
  • fileprivate限制对当前文件的访问。
  • internal限制访问当前模块。
  • public允许模块之间的访问,并防止子类化。
  • open允许模块之间的访问并允许子类化。

您也可以将一个类标记为final以防止其被子类化,并帮助控制该对象的使用方式。

您可以控制对以下内容的访问:

  • 构造,例如类,构造,协议和枚举。
  • 元素,例如属性和方法。
  • 扩展程序。
  • 属性设置器。

让我们来看一些实际的访问控制示例。

使用我们的Swift技巧:组织文章中的组织技巧,我们刚刚在视图控制器上创建了一个扩展以符合UICollectionViewDelegate协议。 我们实现了必要的协议方法,并在此过程中创建了一些辅助方法来减少样板或冗余逻辑。

到目前为止,这是所有标准的日常工作。 现在,让我们问一个问题:模块的其余部分(甚至是该文件)是否需要了解或可以访问这些辅助方法?

如果我们将这些方法标记为private ,则它们将不再在视图控制器及其扩展名的同一文件内访问。

假设我们要在API中创建一个只读属性。 像这样简单地注释属性: fileprivate(set) var someProperty: SomeType 。 在源文件中,您将能够像正常一样获取和设置属性。 但是,在源文件之外,此属性将是只读的。

这也适用于其他访问控制级别。 例如:

  • private(set)将setter限制为同一文件中拥有的类或结构及其扩展名。
  • internal(set)将setter限制为当前模块,因此导入当前模块的外部模块将无法设置此属性。

创建辅助结构或对象来包装类需要在内部传递的信息单元是很常见的。 将这些帮助程序标记为`fileprivate`会将它们隐藏为不重要的实现细节。

— –

如果您未指定访问级别,则将假设为“内部”。 有一些细微的例外。 Apple的访问控制文档具有所有详细信息,但实际上可以归结为Apple的以下报价:“无法用具有较低(更严格)访问级别的另一个实体来定义实体。”例如,类型定义为“内部”的类型不能设为“公共”类型。

访问控制是一个很好的工具,用于声明代码意图,同时封装不重要的实现细节。 这将有助于使您的API更加易于使用和安全。 与大多数事情一样,使自己熟悉Swift的访问控制功能并了解何时应用它们的最佳方法是通过练习。

下周,我们将深入研究Swift的早期退出方式,看看它们如何帮助减少嵌套并清楚地表明期望和可能的结果。


有关设计和开发的更多见解,请订阅 BPXL Craft 并在 Twitter上 关注Black Pixel

Black Pixel是一家创意数字产品代理商。 了解更多信息,请访问 blackpixel.com