Enums 在Swift中,是否可以预填充枚举的值’;编译时关联的值是多少?

Enums 在Swift中,是否可以预填充枚举的值’;编译时关联的值是多少?,enums,swift,definition,Enums,Swift,Definition,我正在重构本文中的一些代码 我的目标是创建几个枚举来模拟Tic-Tac趾板,而不是依赖于对应于游戏板正方形的“幻数”整数。 我有一个对应于每个具有原始Int值的磁贴: enum TileLocation:Int { case TopLeft = 1, TopMiddle = 2, TopRight = 3, MiddleLeft = 4, Center = 5, MiddleRight = 6,

我正在重构本文中的一些代码

我的目标是创建几个枚举来模拟Tic-Tac趾板,而不是依赖于对应于游戏板正方形的“幻数”整数。 我有一个对应于每个具有原始Int值的磁贴:

enum TileLocation:Int
{
    case TopLeft = 1,
         TopMiddle = 2,
         TopRight = 3,
         MiddleLeft = 4,
         Center = 5,
         MiddleRight = 6,
         BottomLeft = 7,
         BottomMiddle = 8,
         BottomRight = 9
}
我想创建一个TileRow枚举,它表示代表“三合一”胜利条件的各种3平方行(水平、垂直、对角线)。我希望每一行都包含一个元组原始值,由三个对应的TileLocation组成:

enum TileRow
{
    case HorizontalTop = ( TopLeft, TopMiddle, TopRight ),
         HorizontalMiddle = ( MiddleLeft, Center, MiddleRight ),
         HorizontalBottom = ( BottomLeft, BottomMiddle, BottomRight ),
         // etc.
}
这会导致错误“枚举大小写的原始值必须是文字”,因此我接下来尝试使用元组作为关联值定义枚举:

enum TileRow
{
    case HorizontalTop( TileLocation , TileLocation, TileLocation )
    case HorizontalMiddle( TileLocation, TileLocation, TileLocation )
    case HorizontalBottom( TileLocation, TileLocation, TileLocation )
    case VerticalLeft( TileLocation, TileLocation, TileLocation )
    case VerticalMiddle( TileLocation, TileLocation, TileLocation )
    case VerticalRight( TileLocation, TileLocation, TileLocation )
    case DiagonalLeftToRight( TileLocation, TileLocation, TileLocation )
    case DiagonalRightToLeft( TileLocation, TileLocation, TileLocation )
}

这不会产生任何错误,但由于枚举没有init()方法,因此无法使用所需的常量预填充关联值。我可能忽略了一些显而易见的事情。我读过这篇文章,没有看到任何解决方案。对如何进行有什么建议吗?有没有更好的方法用Swift对这些数据建模?

是的,很遗憾你不能这样做。你可以用Java编程,所以我习惯了像你展示的那样编码。我能想到的最接近的是:

enum TileLocation : Int {
    case TopLeft = 1,
        TopMiddle = 2,
        TopRight = 3,
        MiddleLeft = 4,
        Center = 5,
        MiddleRight = 6,
        BottomLeft = 7,
        BottomMiddle = 8,
        BottomRight = 9
    static let HorizontalTop = ( TopLeft, TopMiddle, TopRight ),
        HorizontalMiddle = ( MiddleLeft, Center, MiddleRight ),
        HorizontalBottom = ( BottomLeft, BottomMiddle, BottomRight )
        // etc.
}

唯一的缺点是,在switch语句中,您必须添加一个引发运行时异常的默认情况,即您丢失了编译时检查。

TileRow的最后一个实现并不能满足您的需要;它提供了静态工厂方法来制作水平面等等,也就是说,你可以有多个水平面(没有任何东西可以阻止它们有不同的位置)。