在Swift中存储枚举类型

时间:2016-06-21 09:08:43

标签: swift generics enums rawrepresentable

我正在为我的库(https://github.com/JiriTrecak/Warp)开发Enum序列化,并且我很少停留在属性中存储枚举类型(我需要知道该类型,因此我可以根据需要对其进行序列化/反序列化)。

我有一个结构,其中包含您可以拥有的所有属性的描述,包括它们的类型,远程键等,如果是enum,我想再存储一个可选信息,即Enum类型为找到密钥后创建(例如,性别)。

我尝试了两种方法,两种方法都无法使用:

A)在容器定义中声明泛型类型

public struct WRPProperty<T: RawRepresentable> {
    var enumType : T?

    public init(remote : String, enumType: T) {
        self.enumType = enumType
    }
}

这是有效的,这种方法的问题是我不希望每个WRPProperty都有枚举。通过声明它,它会强制用户在创建属性时始终添加数据类型,这是不需要的行为。我也可以创建WRPEnumProperty的对象,但由于库处理这些定义以及用户如何定义它们,这是不可用的。

B)在init方法中声明泛型类型

public struct WRPProperty {
    var enumType : RawRepresentable

    public init<T: RawRepresentable>(remote : String, enumType: T) {
        self.enumType = enumType
    }
}

哪个不起作用,因为RawRepresentable只能用作通用约束。

所以我的问题是,我如何存储枚举类型,这样我就可以在任何时候创建任何类型的枚举? (另外,我使用的是Swift 2.2)

1 个答案:

答案 0 :(得分:1)

在您的示例(B)中,即使编译器允许,也无法保证init enumType与enumType属性相同。

在这种情况下,我能想到的唯一解决方案是忽略类型安全并使用Any

public struct WRPProperty {
    var enumType:Any?
    public init<T:RawRepresentable>(remote : String, enumType: T) {
        self.enumType = enumType
    }
}

除非您能找到一些巧妙的方式来包装您的价值观或采用更复杂的type erasure。这为您提供了您正在寻找的动态能力(尽管最佳解决方案可能是重构您的方法,以便在实例化时可以设置枚举类型)。