在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中的枚举相同的枚举?
非常感谢
答案 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")
}