Swift 创建具有特定值/存储属性的枚举
我有一个Swift 创建具有特定值/存储属性的枚举,swift,enums,Swift,Enums,我有一个CompassDirectionenum,我通常在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)方法中使用它们,如下所示: public Position alter(Position
CompassDirection
enum,我通常在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)
方法中使用它们,如下所示:
public Position alter(Position pos) {
return new Position(pos.x + this.alterX, pos.y + this.alterY);
}
我的目标是在Swift中完成类似的事情。我可以很容易地在我的alter()
方法中添加一个8-caseswitch
语句,但这会增加更多的代码和混乱
这是我在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枚举的最具可读性/最快捷的解决方案是什么
Swift不支持枚举中存储的属性
您可以创建xAlter
和yAlter
计算属性。下面是一个高度简化的示例(只有两个基本方向):
现在,您可以添加一个引用
self.alterX
和self.alterY
的方法,完全符合您的要求。感谢@matt的计算属性想法,我喜欢创意。这是另一个使用详尽的开关的解决方案:
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)
}
}
谢谢马特,猜疑被证实。我不知道你说的“猜疑被证实”是什么意思。这与您的Java代码完全相同。我们为每个案例提供恒定的属性值。只是符号有点不同。这与在alter
中放置开关形成鲜明对比,在alter
中,我们必须在每次调用alter
时执行开关。我的意思是,如果没有彻底的开关,就无法实现这一点。这在Java中是可能的,因为可以用x/y alter参数简捷地构造枚举。(请参阅我的问题中alter()
的Java实现。)由于Swift不支持枚举中存储的属性,因此交换机是唯一的路由。同意。我的观点只是你的Java和我的Swift是完全相同的东西的两个缩写。你不会发现我在争论斯威夫特的速记“更好”!但最后——我也这么认为——问题只在于你在页面上的什么地方写下了神奇的数字。
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)
}
}