enums - 在 Swift 中,是否可以在编译时为枚举的关联值预填充值?

标签 enums swift definition

我正在重构这个 “Swift-Tac-Toe” tutorial 中的一些代码.

我的目标是创建几个枚举来模拟 Tic-Tac-Toe 棋盘,而不是依赖与游戏棋盘方 block 对应的“魔数(Magic Number)”整数。 我有一个对应于具有原始 Int 值的每个图 block :

enum TileLocation:Int
{
    case TopLeft = 1,
         TopMiddle = 2,
         TopRight = 3,
         MiddleLeft = 4,
         Center = 5,
         MiddleRight = 6,
         BottomLeft = 7,
         BottomMiddle = 8,
         BottomRight = 9
}

我想创建一个 TileRow 枚举,它表示代表“三合一”胜利条件的各种 3 方形行(水平、垂直、对角线)。我想让每一行都包含一个由三个对应的 TileLocations 组成的元组原始值:

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() 方法,因此无法使用我想要的常量预填充关联值。我可能在这里忽略了一些明显的东西。我读过 associated values documentation并没有看到任何解决方案。关于如何进行的任何建议?有没有更好的方法来使用 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 语句中你必须添加一个 default case 来抛出运行时异常,也就是说你失去了编译时检查。

关于enums - 在 Swift 中,是否可以在编译时为枚举的关联值预填充值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25026323/

相关文章:

ios - Swift 2 中的 "Extra argument ' 错误 ' in call"错误

c - 我无法在链表中使用链表

c++ - 声明没有指针的默认参数循环引用?

java - String(或 T)和 Enum 的父类(super class)

c# - 在 C++ 的另一个类中调用枚举

ios - 如何在 Swift 的 CoreData 模型中保存动态创建的 UISwitch 的更改状态?

c# - .NET 二进制序列化元数据

xcode - Swift 3 - 如何使用枚举原始值作为 NSNotification.Name?

c# - 为什么我不应该在标志枚举中使用 0

c# - 如何在 Unity3d MonoDevelop 中使用继承?