我正在努力创建一个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)!)
}
}
除了圆圈,我别无选择。
关于如何解决该问题的任何想法?
答案 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) {
...
}