如何在Swift中使用枚举内的函数选择枚举值?

时间:2018-08-27 18:01:38

标签: ios swift enums sprite-kit

我正在努力创建一个SpriteKit游戏,我试图选择一个枚举值,该枚举值带有一个位于枚举内部的函数,以便可以使用其外部的每个值。

这是我的代码:

enum Classification: Int, CustomStringConvertible {
    case Circle = 0, Square, Triangle

    var classificationName: String {
        switch self {
        case .Circle:
            return "circle"
        case .Square:
            return "square"
        case .Triangle:
            return "triangle"
        }
    }

    var description: String {
        return self.classificationName
    }

    var classificationSpriteName: String {
        let classificationSpriteName = [
        "circle",
        "square",
        "triangle"
        ]
        return classificationSpriteName[rawValue]
    }

    static func useGeometry() -> Classification {
        return Classification(rawValue: Int())!
    }
}

class Shape: CustomStringConvertible, Hashable {
    var hashValue: Int {
        return self.column ^ self.row
    }
    var column: Int
    var row: Int
    let shapeType: Classification

    var shapeSprite: SKSpriteNode?

    var classificationName: String {
        return shapeType.classificationName
    }

    ….(code)…

    final class func chosenShape(shapeStartingColumn:Int, shapeStartingRow:Int) -> Shape {
        switch Classification.useGeometry() {
        case .Circle:
            return CircleShape(column:shapeStartingColumn, row:shapeStartingRow, shapeType: Classification(rawValue: 0)!)
        case .Square:
            return SquareShape(column:shapeStartingColumn, row:shapeStartingRow, shapeType: Classification(rawValue: 1)!)
        case .Triangle:
            return SquareShape(column:shapeStartingColumn, row:shapeStartingRow, shapeType: Classification(rawValue: 2)!)

        }
    }

除了圆圈,我别无选择。

关于如何解决该问题的任何想法?

2 个答案:

答案 0 :(得分:0)

函数useGeometry每次都会返回.Circle,因为您以Int()的rawValue 0开始。

实施该功能以返回self(应该不再是静态的)并在开关中使用shapeType

答案 1 :(得分:0)

问题在于此功能:

static func useGeometry() -> Classification {
    return Classification(rawValue: Int())!
}

您正在创建一个带有由Int()评估的rawValue的新分类,它将返回一个具有默认值(Int()== 0)的新Int对象。

因此,当您从switch语句调用useGeometry时,实际上将始终返回.Circle,因为rawValue实际上始终为0。

您可能想要传递一个整数(例如行值?)来使用Geometry,它与一个Category枚举值匹配。像这样:

static func useGeometry(value: Int) -> Classification {
    return Classification(rawValue: value)!
}

注意:请注意不要用无效的值调用它,否则将导致崩溃,因为您将强制展开构造函数的结果。 然后用一个值调用它:

switch Classification.useGeometry(value: shapeStartingRow) {
...
}