我有一个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)
...
构造函数需要alterX
和alterY
整数属性,存储它们,并在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解决方案是什么?
答案 0 :(得分:1)
Swift不支持枚举中的存储属性
您可以制作xAlter
和yAlter
个计算属性。这是一个高度简化的例子(只有两个主要方向):
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.alterX
和self.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)
}
}