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错误? 请告诉我你是否知道。