如何在Java中像Swift一样用构造函数实现枚举?

时间:2014-07-17 11:22:42

标签: java swift

例如,我们有如下的Java代码;

enum Job {
    NINJA(3000000){
        public void attack() {
            //use Shuriken
        }
    },
    SAMURAI(4000000){
        public void attack() {
            //use Sword
        }
    };
    public final int salary;
    public abstract void attack();
    private Job(int salary) {
        this.salary = salary;
    }
}

在Swift中,我认为我们不能定义构造函数并且有任何枚举方法。

我发现在下面的Swift代码中我们可以有类似的结构,但不能有任何方法。

class Job {
    class Store {
        let salary : Int
        init(int salary) {
            self.salary = salary
        }
    }
    class var NINJA: Store{
        return Store(3000000)
    }
    class var SAMURAI: Store{
        return Store(4000000)
    }
}
// Job.NINJA.salary

当然,我知道Swift enum可以拥有自己的属性。

但是如果在下列情况下你有更多的属性,我们必须在每个属性上有这么多的开关。我认为这不聪明。

enum Job {
    var salary: Int{
        switch self{
        case NINJA:
            return 3000000
        case SAMURAI:
            return 4000000
        }
    }
    case NINJA
    case SAMURAI
}

那么,如果你是我,在这种情况下你如何编写Swift代码?

2 个答案:

答案 0 :(得分:4)

在swift中使用 struct 的示例:

struct MyEnum {

    static let TYPE1 = MyEnum(id: 1, text: "type 1")
    static let TYPE2 = MyEnum(id: 2, text: "type 2")

    let id: Int
    let text : String

    init(id:Int, text:String) {
        self.id = id
        self.text = text
    }

    func getId()->Int {
        return id;
    }

    func getText() ->String {
        return text;
    }

    static func values()->Array<MyEnum> {
        return [TYPE1,TYPE2]
    }

}

func == (left: MyEnum, right: MyEnum) -> Bool {
    return left.id == right.id
}

用法示例:

for e in MyEnum.values() {
    println(String(e.getId()) + " " + e.getText())
}

let type1 = MyEnum.TYPE1
if (type1==MyEnum.TYPE1) {
    println("is Type 1")
} else {
    println("is not Type 1")
}

控制台输出

1 type 1
2 type 2
is Type 1

答案 1 :(得分:3)

以下是如何在Swift中调整Job类,使其在Java中表现为enum

class Job {
    class Store: Equatable {
        let salary: Int

        @private init(_ salary:Int) { // hope Swift will have private accessors one day
            self.salary = salary
        }

        func atack() ->() {}

    }

    class var NINJA: Store {
        class Ninja: Store {
            override func atack() ->() {
                println("Attack with shuriken.")
            }
        }
        return Ninja(3000000)
    }

    class var SAMURAY: Store {
        class Samuray: Store {
            override func atack() ->() {
                println("Attack with sword.")
            }
        }
        return Samuray(4000000)
    }

    class func CUSTOM(salary: Int) -> Store {
        return Store(salary)
    }
}

func == (lhs: Job.Store, rhs: Job.Store) -> Bool {
    return lhs.salary == rhs.salary
}

用法示例:

var ninja = Job.NINJA
var samuray = Job.SAMURAY
var custom = Job.CUSTOM(23)

if (ninja == samuray) {
    println("Impossible")
} else {
    println("OK")
}

if (ninja == Job.NINJA) {
    println("Ninja salary: \(ninja.salary)")
} else {
    println("Impossible")
}

println("Object salary: \(Job.SAMURAY.salary)")
samuray.atack()

在操场上输出

  

好的

     忍者工资:3000000

     

对象薪水:4000000

     

用剑攻击。

顺便说一句:如果你需要比较工资值,你可以在Comparable课程中实现Store界面。用于排序。