用嵌套类型命名Swift代码

⚠️已弃用

有关本文的最新版本, 请在Sundell的Swift上阅读 而您也可以在其中找到100多种有关Swift的文章。 中型版本尚未针对Swift的最新版本进行更新,也未进行其他改进(例如语法突出显示)进行了更新。

尽管Swift尚未提供专用的namespace关键字,但它确实支持其他类型的嵌套类型。 让我们看一下如何使用此类嵌套类型可以帮助我们改善代码的结构。

许多Swift开发人员习惯于通过在类型的实际名称中包括结构级别来进行命名PostTextFormatterOption -使用诸如PostTextFormatterOption (用于Text Formatter PostTextFormatterOptionText FormatterOption )之类的名称。 这可能是因为,这几乎是在Objective-C和C中进行“穷人命名”的唯一方法,并且像许多其他约定一样,它已经延续到Swift中。

让我们以上述类型为例,看看PostPostTextFormatterPostTextFormatterOption

现在让我们看一下如果我们将它们构造为Post内部的嵌套类型,则上述类型将如何变化:

嵌套类型方法的一大优势是,我们现在可以通过快速查看代码来清楚地看到类型之间的结构和关系。 我们还减少了初始化程序中的冗长性,使其更短Set易于阅读(现在options参数只是Set类型而不是Set )。

现在,我们在呼叫站点也有了清晰的层次感-与Post相关的所有内容现在都在Post.下结构整齐Post. 命名空间。 以下是格式化帖子文本的格式:

但是,使用上述嵌套类型也有很大的弊端。 该代码在垂直方向上是“向后”的,其中父类型的实际内容一直向下推送到底部。 因此,让我们尝试通过翻转结构来解决此问题-将嵌套类型向下移动到底部,而不是将它们放在顶部(为方便MARK ,我们还会添加一些MARK )。

到底是将嵌套类型放在顶部还是底部,这绝对是个人喜好。 我有点喜欢它如何使父类型的实际内容保持在顶部,同时仍为代码提供嵌套类型的层次结构好处。

但是,就像Swift中的许多其他功能一样,事实证明,还有很多其他方法可以实现命名空间和嵌套类型。

扩展中的嵌套类型

一种选择是使用扩展来实现您的嵌套类型。 这使您可以更清楚地区分类型,同时在实现和调用站点中仍保留层次结构。

这是我们的类型的外观:

使用类型别名

您还可以在原始代码(不使用嵌套类型)中添加类型别名,以实现嵌套的类型化行为。 尽管这不能为您提供实现中相同的层次结构,但是它确实有助于减少冗长性,并且在调用站点上也提供与使用嵌套类型时相同的好处。

该选项如下所示:

结论

使用嵌套类型可以帮助您在代码中创建一个非常漂亮的结构和层次结构,以使您更加清楚各种类型之间的关系-在实现中和在调用站点中。

但是,根据您选择实施这些技术的方式,您可能还会面临其他挑战和副作用-因此,我认为根据情况选择技术真的很重要,这样才能最终赢得胜利。

你怎么看? 您更喜欢使用以上哪种技术来命名代码? 还是找到了另一个? 在Twitter @johnsundell上让我知道,以及任何问题或评论。

(哦,顺便说一句,从Swift 3.1开始,嵌套类型也可以在泛型内部使用!🎉…但有关更多信息,请参见即将发表的文章😉)

谢谢阅读! 🚀