TinySolution:解决枚举的限制

此文章同时提供中文版本: TinySolution:解决enum的限制

Swift的enum比Objective-C强大得多。 我们可以基于具有不同参数的各种类型创建案例值,这在不同状态或对象具有不同数据类型的情况下很有用。 例如, Result类型非常有用。

顺便说一句: Result类型将在Swift5中正式支持。 SE-0235

尽管enum功能强大,但仍有一些限制。 例如,我们经常需要绘制两条具有自定义线宽的实线和虚线。 目前,我们可以使用enum来实现。

在实际项目中,事情从未如此简单

除线宽外,虚线还需要支持自定义的虚线宽度和空格。 当然,我们可以将Line更改为以下格式:

问题已解决,但是大多数虚线使用相同的虚线宽度和空格。 我们不想每次都手动传递相同的值,因此我们尝试使用默认参数:

不幸的是,编译器告诉我们enum不支持默认参数。 但是我们在Objective-C上长期存在这种限制,并且我们熟悉如何以其他方式实现默认参数。 所以我们改为:

编译器告诉我们一切正常。 三个case对象的创建也成功。 那么问题解决了吗? 至少看起来是这样。

怪现象

当您开始编写switch方法时,事情并没有按您预期的那样工作。 例如,我添加了output()方法,并出现警告:

似乎前一个case dash(...)包含后一个情况的所有情况。 考虑到这一点,让我们交换一下:

但是,仍然出现相同的警告。 似乎这两种case dash(...)与编译器完全相同,因此我们无法找到确切的case

如果这是所有问题,那么这种实现在某些情况下仍然有用。 不幸的是,事实并非如此。 让我们根据Line的最后一个实现编写一些测试:

您可以看到Line.dash(width:1)被判断为default ,并且不属于Line.dash 。 因此,这种工具已经是一个例外。 后一种case将覆盖前一种情况。 前者只能创建而不能由switch判断,因此基本上这种case是没有用的。

也许这是一个Swift错误? 请告诉我你是否知道。