扩展,私有和文件私有

封装是面向对象编程的四个基本原理之一。 访问控制是启用封装的设备的一部分[1]。 私有,文件私有,内部和开放是Swift中可用的四个访问控制。

这篇文章是关于我将如何使用扩展以及private和fileprivate来组织我的代码的简短说明,这导致了抽象。

在项目开始时很难进行抽象,尤其是在产品的所有功能和要求不清楚时。 在这里,我们组织代码的方式非常方便。

我从中受益的一件事就是使用扩展来组织我的代码。 随着项目的发展,这些扩展趋向于成为单独的类,结构或协议(在我的情况下主要是协议),并帮助我将自己的意图清楚地传达给其他开发人员。

让我们看一下这个新闻应用程序的示例,该示例具有两个集合视图选项卡,每个选项卡都显示某种类型的内容列表

TabA —显示来自某些集合的列表,但是没有完全定义需求。

TabB-显示最近添加的新闻文章,基于文章中嵌入的内容,UICollectionViewCell中将有一个媒体指示器(视频或音频)。 在本文中,我将重点介绍媒体指示器功能。

我们知道TabB的要求,此处显示了一个名为ArticleTeaser的视图模型(以1为例)。 它具有标题,文章的简短摘要以及文章中嵌入的媒体。 有一个计算属性mediaDisplayType ,它显示媒体是什么类型。

现在,让我们看一下另一个示例,该示例说明我们如何使用一些扩展来组织代码

现在,此扩展程序提供了从媒体列表中找到嵌入的媒体类型的功能。 这也使其他开发人员可以清楚地使用mediaThumbnailType fileprivate函数,该函数是此扩展的接口。

我的一位同事总是问我为什么您只有一个功能的扩展名? 答案是我倾向于将提供类/结构的特定行为的函数归类为扩展,即使它只是一个函数。 随着代码库的增加,这很方便。

现在,当TabA的要求到达时,我们注意到它还必须显示一些有关媒体类型的信息。 如果我们注意到扩展,我们使用的函数没有副作用,因此我们可以轻松地将其移入协议。

我们可以想到具有文件私有功能的这些扩展,就像我们编写的任何其他接口一样,但也可以作为在单个类/结构中使用的接口。 编码愉快!

[1] https://en.wikipedia.org/wiki/Access_control