为什么带有关联值的Swift枚举不能具有原始值

枚举(简称:枚举)是以某种方式归属在一起的不同值的集合,例如机场列表:

传统上,每个枚举案例仅是一个Integer值的标签。 仅当计算机本身在内部与这些Integer一起工作时,才需要使用这些标签来使代码对人类可读。

Swift枚举仍然具有该核心功能,但是您可以使用它们做更多的事情。

原始值

首先,您不必将Integers用于特定情况下表示的值。 您可以改用StringsCharacters甚至Floats 。 如果要使用三个字母的IATA代码作为枚举案例的备用值,则可以执行以下操作:

无论选择哪种类型,分配给案例的值都称为rawValue

关联价值

现在,您将获得一列始终标有其所在城市名称的机场列表。 但随后您意识到有些城市有多个机场:例如伦敦。 在早期,您必须重命名所有枚举用例才能实现一致的命名,例如

但是我们可能同意,它比我们以前使用的简单的带有城市标签的枚举更加丑陋且可读性较差。 原因是我们实际上是在混合两种不同类型的信息:机场所在的城市机场本身。 从数学上讲,这是两个维度,我们试图将其打造成只有一个维度的单个枚举。 (毕竟,这只是一个列表。)

幸运的是, Swift提供了解决此难题的方法:它允许您将一个(或几个)附加值绑定到枚举实例。 这些值称为关联值 。 例如,我们可以使用字符串来标识特定的机场,并且由于它仅在当前列表中是伦敦市所需要的,因此我们仅将此关联值添加到伦敦案例中:

现在,我们回到带有干净城市标签的枚举,仅使用附加值来标识需要的特定机场。

由于String不是非常安全的类型并且容易出错,因此我们可以更进一步,将其替换为另一个枚举:

现在我们的机场枚举看起来像这样:

当我们定义这种枚举类型的变量时,我们现在可以为该变量分配“常规”枚举大小写,以及具有关联值的枚举大小写。