Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 创建具有特定值/存储属性的枚举_Swift_Enums - Fatal编程技术网

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-case
switch
语句,但这会增加更多的代码和混乱

这是我在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)
    }
}