我正在重构这个“Swift-Tac-Toe”教程中的一些代码。
我的目标是创建几个枚举来建模井字游戏板,而不是依赖于对应于游戏板方块的“魔法数字”Ints。我有一个对应于每个具有原始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-in-row”胜利条件的各种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()方法,所以没有办法用我想要的常量预先填充相关值。我可能忽略了一些显而易见的东西。我已经阅读了相关的值留档,没有看到任何解决方案。关于如何继续的任何建议?有没有更好的方法用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语句中,您必须添加一个引发运行时异常的默认情况,即您放松了编译时检查。