Swift 中的 Java 式枚举

Aus*_*n E 3 java enums swift

我已经使用 Java 一段时间了,目前正在学习 Swift。在 Java 中,我在创建小游戏作为学习语言的一种方式时使用了相当多的枚举。然而,在这个游戏中开始构建“种族”和“武器”时,我遇到了一个问题。Swift 不像 Java 那样处理枚举。所以我的问题是如何在 Swift 中编写以下 Java 代码,以便以类似的方式使用它。

public enum EnumWeapon {
    WOODEN_SWORD("Wooden Sword", 4),
    STONE_SWORD("Stone Sword", 6), 
    STEEL_SWORD("Steel Sword", 8); 

    private String name;
    private int damage;

    private EnumWeapon(String name, int damage) {
        this.name = name;
        this.damage = damage;
    }

    public String getName() {
        return name;
    }

    public int getDamage() {
        return damage;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*rry 7

最明显的方法是:

public enum EnumWeapon {
    case WOODEN_SWORD
    case STONE_SWORD
    case STEEL_SWORD

    func getName() -> String {
        switch self {
        case WOODEN_SWORD:  return "Wooden Sword"
        case STONE_SWORD:   return "Stone Sword"
        case STEEL_SWORD:   return "Steel Sword"
        }
    }

    func getDamage() -> Int {
        switch self {
        case WOODEN_SWORD:  return 4
        case STONE_SWORD:   return 6
        case STEEL_SWORD:   return 8
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您有一个值与每个枚举案例关联,您可以使用原始值语法,或者仅使用它来简化上面的枚举案例:

public enum Weapon : Int {
    case WOODEN_SWORD = 4
    case STONE_SWORD = 6
    case STEEL_SWORD = 8

    func getDamage() -> Int {
        return rawValue
    }

    func getName() -> String {
        switch self {
        case .WOODEN_SWORD: return "Wooden Sword"
        case .STONE_SWORD:  return "Stone Sword"
        case .STEEL_SWORD:  return "Steel Sword"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,如果不需要名称,则可以省略该getName函数。同样,您可以省略该getDamage功能,只需使用weapon.rawValue

一种更简单但更类似于实际 Java 实现的方法是使用结构而不是枚举,如下所示:

public struct Weapon {
    public let name : String
    public let damage : Int

    private init(name:String, damage:Int) {
        self.name = name
        self.damage = damage
    }

    public static let WOODEN_SWORD = Weapon(name: "Wooden Sword", damage: 4)
    public static let STONE_SWORD = Weapon(name: "Stone Sword", damage: 6)
    public static let STEEL_SWORD = Weapon(name: "Steel Sword", damage: 8)
}
Run Code Online (Sandbox Code Playgroud)

并且,重新定义运算符 ==,您可以获得相等比较:

func == (lhs:Weapon, rhs:Weapon) -> Bool {
    return lhs.name == rhs.name && lhs.damage == rhs.damage
}
Run Code Online (Sandbox Code Playgroud)

并且,通过重新定义 operator ~= 您可以按预期切换工作:

func ~= (lhs:Weapon, rhs:Weapon) -> Bool {
    return lhs == rhs
}

func test(sword:Weapon) {
    switch sword {
    case Weapon.STONE_SWORD:    print("stone")
    default:                    print("something else")
    }
}

test(Weapon.STONE_SWORD)
Run Code Online (Sandbox Code Playgroud)

很多选项,主要取决于您真正想要做什么以及需要在枚举中包装多少数据。