像在Java中一样,在Swift 2中编写一个简单的枚举

时间:2015-09-30 14:43:27

标签: swift enums case

在Java中,我可以创建一个带整数的枚举,如下所示:

public
enum MyEnum {
    FOO(1), BAR(4), BAZ(8);

    private
    int value;

    MyEnum(int value) {
        this.value = value;
    }

    public
    int getValue() {
        return value;
    }
}

如何在Swift(2.0版)中执行相同的操作?我的猜测是:

public
enum MyEnum {
    case FOO(1)
    case BAR(4)
    case BAZ(8)

    public
    let value: Int

    init(value: Int) {
        self.value = value
    }
}

但是尝试编译它会产生以下错误:

Expected type
Expected ',' separator
Expected type
Expected ',' separator
Expected type
Expected ',' separator
Enums may not contain stored properties

(前两行"案例FOO(1)",第二个"案例BAR(4)",第三个"案例BAZ(8)"以及该行的最终错误"让值:Int")

如何修复此Swift代码以创建与Java中的枚举相同的枚举?

非常感谢

3 个答案:

答案 0 :(得分:2)

 public
  enum MyEnum: Int {
    case FOO = 1
    case BAR = 4
    case BAZ = 8
  }

  var foo = MyEnum(rawValue: 4)
  var rawValue = foo?.rawValue

在Swift中,不需要底层值的构造函数/ getter。这些包含在枚举类型中(如rawValue,这是您的Enum继承的类型)

另外,请注意,接受rawValue的构造函数是可用的(即返回一个可选的),因为它可以传入一个没有映射到的rawValue一个MyEnum

答案 1 :(得分:1)

试试这个,直接翻译......

public enum MyEnum: Int { // You need to declare the raw type
    case FOO = 1 // use "= x" rather than "(x)"
    case BAR = 4
    case BAZ = 8

    //public let value: Int // Enums may not contain stored properties
    //... but can contain computed values
    var value: Int {
        get {
            return self.rawValue
        }
    }

    init?(value: Int) { // Fails if not 1, 4 or 8, hence "init?"
        //self.value = value // Now meaningless
        self.init(rawValue: value)
    }
}

或者,你可以跳过大部分内容并使用内置的Enum init&属性...

public enum MyEnum: Int { // You need to declare the raw type
    case FOO = 1 // use "= x" rather than "(x)"
    case BAR = 4
    case BAZ = 8
}

let myEnum = MyEnum(rawValue: 4) // BAR
let four = myEnum?.rawValue // 4
let another = MyEnum(rawValue: 5) // nil

答案 2 :(得分:1)

您的Java示例使用具有整数值的枚举常量 两个人的力量。因此我假设你的目的是定义一个 类型不仅可以代表那三个常数,而且可以是任意的 整数,例如12(对于" BAR + BAZ"),即"位设置"。

在Swift中,您可以使用符合struct的方便地执行此操作 到OptionSetType。这是一个例子:

struct FileAccess: OptionSetType {
    let rawValue: Int

    static let Read    = FileAccess(rawValue: 1 << 2)
    static let Write   = FileAccess(rawValue: 1 << 1)
    static let Execute = FileAccess(rawValue: 1 << 0)
}

该值存储为Int(或您选择的任何合适类型) 在声明中)。您可以从单个构造值 常数:

let a1 = FileAccess.Read
print(a1.rawValue) // 4

或来自组合:

let a2 = FileAccess([.Read, .Write])
print(a2.rawValue) // 6

或来自任意整数:

let a3 = FileAccess(rawValue: 5)
print(a3.rawValue) // 5

(与enum不同,这不会返回可选项,也不会失败。)

OptionSetType提供了一个可以使用的类似集合的界面 创造新价值:

let r = FileAccess.Read
let w = FileAccess.Write
let rw = r.union(w)

或测试值:

if a1.contains(.Read) {
    print("readable")
}

if a2.isSupersetOf([.Read, .Write]) {
    print("read-write")
}