创建具有特定值/存储属性的枚举

时间:2016-10-20 22:49:54

标签: swift enums

我有一个CompassDirection枚举,我通常在Java中定义如下:

enum CompassDirection {
    N(0, 1), S(0, -1), E(1, 0), W(-1, 0), NE(1, 1), NW(-1, 1), SE(1, -1), SW(-1, -1)
    ...

构造函数需要alterXalterY整数属性,存储它们,并在alter(Position position)方法中使用它们,如下所示:

public Position alter(Position pos) {
    return new Position(pos.x + this.alterX, pos.y + this.alterY);
}

我的目标是在Swift中完成类似的事情。我可以在switch方法中轻松添加8个案例alter()语句,但这会增加更多代码和混淆。

这是我在Swift中尝试过的:

enum CompassDirection {
    case N(0, 1), S(0, -1), E(1, 0), W(-1, 0), NE(1, 1), NW(-1, 1), SE(1, -1), SW(-1, -1)

    private let xAlter : Int
    private let yAlter : Int

    private init(_ xAlter: Int, _ yAlter: Int) {
        self.xAlter = xAlter
        self.yAlter = yAlter
    }

    func alter(position: XYPosition) -> XYPosition {
        return XYPosition(x: position.x + self.xAlter, y: position.y + self.yAlter)
    }
}

但Swift不支持枚举中存储的属性。

将上述Java枚举转换为Swift枚举的最具可读性/ Swifty解决方案是什么?

2 个答案:

答案 0 :(得分:1)

  

Swift不支持枚举中的存储属性

您可以制作xAlteryAlter个计算属性。这是一个高度简化的例子(只有两个主要方向):

enum CompassDirection {
    case n
    case s
    var alterX : Int {
        switch self {
        case .n: return 0
        case .s: return 0
        }
    }
    var alterY : Int {
        switch self {
        case .n: return 1
        case .s: return -1
        }
    }
}

现在,您可以根据需要添加引用self.alterXself.alterY的方法。

答案 1 :(得分:0)

感谢@matt的计算属性理念,我喜欢创造力。这是使用详尽switch

的另一种解决方案
enum CompassDirection {
    case N, S, E, W, NE, NW, SE, SW

    func alter(position: XYPosition) -> XYPosition {
        var xAlter : Int = 0
        var yAlter : Int = 0

        switch(self) {
            case CompassDirection.N:
                yAlter = 1
            case CompassDirection.S:
                yAlter = -1
            case CompassDirection.E:
                xAlter = 1
            case CompassDirection.W:
                xAlter = -1
            case CompassDirection.NE:
                xAlter = 1; yAlter = 1
            case CompassDirection.NW:
                xAlter = -1; yAlter = 1
            case CompassDirection.SE:
                xAlter = 1; yAlter = -1
            case CompassDirection.SW:
                xAlter = -1; yAlter = -1
        }

        return XYPosition(x: position.x + xAlter, y: position.y + yAlter)
    }
}