在Swift中扩展枚举

我从几年前就开始使用Swift进行开发,甚至还用它编写了一个应用程序(Knowtrail),但是最近我开始通过使用Swift进行编码来谋生。 但是直到现在我才真正尝试过的一件事就是扩展枚举。

那是因为我还没有意识到Swift中有更多强大的枚举! 我必须解决的问题是我想编写一个管理器对象,该对象可以在蓝牙外围设备上写属性。 这些属性具有有限数量的可能值,因此使用枚举。 但是,每个属性具有一组不同的值,因此需要不同的枚举类型。 但是我仍然希望我的经理不管所有属性和类型如何,都以相同的方式处理所有属性,从而节省了代码行并获得了代码质量和整洁度。 主要是我想要一种集中式的方法来检查属性是否具有有效值(以我的蓝牙外围设备的角度而言),并且还从枚举中将该值导出为适合通过蓝牙写入的格式(在iOS中,这是Data类)。

知道我们在Swift方面取得的巨大进步之一就是它的态度:一切都应该是可扩展的并且可以协议化。我难以置信地半信半疑地试图在枚举中编写一些方法,以扩展它们并使之发挥作用!

我嵌入了一个大致示例的示例:

由于我希望所有枚举都能独立于其类型进行处理,因此Swift的实现方法是通过协议。 因此,我们可以看到上面定义的两个协议(Invalidable和Exportable),这些协议允许符合它们的任何对象提供一种方式,让任何人知道该对象的值是否有效,以及一种以所需格式获取其值的方法。

Environments枚举同时符合这两个协议,并且在isValid()方法中可以看到,枚举在所有方面都是对象。 我们可以访问自我及其属性! 它还支持类继承,在我们的示例中是UInt8。 通过继承UInt8,我们可以得到很好的副作用:根据其顺序,所有可能的值都将获得UInt8值(例如.indoors为0,.semiOutdoors为1等)

使用协议的另一个优点是它可以被非枚举对象采用,我们仍然可以导出它们的值并检查它们是否有效。 在我的情况下,我具有一些属性,其类型实际上是无限数量的选项(例如32位整数),因此我围绕UInt32创建了包装器自定义对象,并使它符合两种协议。 这样,我可以让其他经理使用相同的属性来处理我的所有属性,而不管它们的枚举类型如何,也不管它们是否是枚举!