Swift枚举作为数组索引

时间:2016-05-06 15:07:42

标签: swift enums

也许我在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;)中一样?

2 个答案:

答案 0 :(得分:6)

简单地:

enum SomeType : Int {
  case Type1, Type2, Type3, TypeInvalid
}

Apple文档声明:

  

默认情况下,Swift会从零开始分配原始值   每次递增一次

所以你得到的Type1的rawValue0。例如:

  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