也许我在swift中误解了枚举,但是在obj-c中我使用了这样的枚举(并且使用了很多):
class SomeObject;
typedef NS_ENUM(NSUInteger, SomeType) {
Type1 = 0,
Type2, // = 1
Type3, // = 2
TypeInvalid // = 3
};
- (SomeType)getTypeOf(NSArray *a, SomeObject *o) {
//for (int i = 0; i < a.count; ++i)
// if ([a[i] isEqual:o])
// return i;
NUInteger result = [a indexOfObject:o];
return result == NSNotFound ? TypeInvalid : result;
}
// Also I could use this:
a[Type3] = someObject;
如何在Swift中做同样的事情?我是否被迫使用常量(let Type1 = 0
),就像在Java(public static final int Type1 = 0;
)中一样?
答案 0 :(得分:6)
简单地:
enum SomeType : Int {
case Type1, Type2, Type3, TypeInvalid
}
Apple文档声明:
默认情况下,Swift会从零开始分配原始值 每次递增一次
所以你得到的Type1的rawValue
为0
。例如:
1> enum Suit : Int { case Heart, Spade, Diamond, Club }
2> Suit.Heart.rawValue
$R0: Int = 0
3> Suit.Club.rawValue
$R1: Int = 3
注意:在您的示例代码中,您需要将return i
替换为return SomeType(rawValue: i)!
(尽管我并不完全理解逻辑,因为显然i
是有限的a.count
可能与[{1}}值不对应)
答案 1 :(得分:3)
除Ed Gamble response外,您还可以手动设置枚举值:
enum SomeType : Int {
case Type1 = 1
case Type2 = 2
case Type3 = 3
case TypeInvalid = -1
}
使用Swift枚举,您不仅限于Int
值:
enum SomeType : String {
case Type1 = "Type 1"
case Type2 = "Type 2"
case Type3 = "Type 3"
case TypeInvalid = "Invalid type"
}
要获取内部值,请致电rawValue
:
let foo = SomeType.Type2
foo.rawValue // returns "Type 2"
您可以使用init(rawValue:)
方法从值构建枚举:
let rawValue = "Type 2"
let foo = SomeType(rawValue: rawValue)
请注意,此init
返回一个可选项,因为它可能找不到与该值关联的有效枚举。使用默认值可以更轻松地处理错误:
let foo = SomeType(rawValue: rawValue) ?? SomeType.TypeInvalid