Как выбрать значение перечисления с функцией внутри перечисления в Swift? - PullRequest
0 голосов
/ 27 августа 2018

Я работаю над созданием игры 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 голосов
/ 27 августа 2018

Проблема в этой функции:

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

Вы создаете новую Классификацию с rawValue, оцененным Int (), который будет возвращать новый объект Int со значением по умолчанию (Int () == 0).

Поэтому, когда вы вызываете useGeometry из оператора switch, он всегда будет возвращать .Circle, потому что rawValue фактически всегда равен 0.

Возможно, вы хотите передать целое число, например, может быть, значение строки?, Чтобы использовать Geometry, что-то, совпадающее до значения перечисления Classification. Примерно так:

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

Примечание. Будьте осторожны, чтобы не вызывать его с недопустимым значением, иначе произойдет сбой, поскольку вы принудительно распаковываете результат конструктора. А затем вызвать его со значением:

switch Classification.useGeometry(value: shapeStartingRow) {
...
}
0 голосов
/ 27 августа 2018

Функция useGeometry возвращает .Circle каждый раз, потому что вы запускаете ее с rawValue 0, что является результатом Int().

Реализуйте эту функцию, чтобы вернуть self (больше не должно быть статичным) и используйте shapeType в коммутаторе.

...