Swift:在编译时将枚举值映射到类型

时间:2015-12-03 08:15:07

标签: ios swift

我在图书馆目标中得到了一个枚举。像这样:

enum SomeEnum {
  case EnumValue1
  case EnumValue2
  case EnumValue3
}

我的应用中有一些结构。像这样:

struct Struct1 {...}
struct Struct2 {...}
struct Struct3 {...}

我的目标是在编译时将此结构映射到我的应用程序中的枚举值。 像这样:

extension SomeEnum {
  case EnumValue1(Struct1)
  case EnumValue2(Struct2)
  case EnumValue3(Struct2)
}

但显然我无法在扩展程序中添加相关值。

库中的原始枚举不应该知道我的应用程序结构。我想在应用程序端执行此映射。所以我无法修改我原来的枚举。我怎样才能做到这一点?

编辑:抱歉,我错过了一个用例示例。我想为每个枚举值创建一个对应结构类型的对象:

func createStruct<T>(type: T.Type) {
  return T()
}

用法:

let enumValue = SomeEnum.EnumValue2
//here I should use an invented way of mapping enum value to struct:
let object = createStruct(enumValue.struct)

2 个答案:

答案 0 :(得分:1)

这是不可能的。来自here

的Qute
  

原始值类型必须符合Equatable协议和其中一个   以下文字可转换协议:IntegerLiteralConvertible   对于整数文字,FloatingPointLiteralConvertible for   浮点文字,字符串文字的StringLiteralConvertible   包含任意数量的字符,和   对于字符串文字,ExtendedGraphemeClusterLiteralConvertible   只包含一个字符。

即使你试图实现Equatable协议 - 它也行不通。

struct Struct1 : Equatable {}

func ==(lhs: Struct1, rhs: Struct1) -> Bool {
    return true // some code here
}

enum SomeEnum {
    case EnumValue1 = Struct1
}

此代码无效。也许你应该创建一些与你的结构相匹配的String

UPD:您可以使用docs中所述的关联值。它将在编译期间而不是运行时。

struct Struct1 {}
struct Struct2 {}
struct Struct3 {}

enum SomeEnum {
    case EnumValue1(Struct1)
    case EnumValue2(Struct2)
    case EnumValue3(Struct3)
}

答案 1 :(得分:0)

你可以用:

extension SomeEnum {
    func getStruct() -> Any.Type {
        switch self {
        case .EnumValue1:
            return Struct1.self
        case .EnumValue2:
            return Struct2.self
        case .EnumValue3:
            return Struct3.self
        }
    }
}

let structType = SomeEnum.EnumValue1.getStruct()

但它似乎没用,因为您不知道structType的类型,必须再次使用switch...case来确定它。