在 Swift 中存储枚举类型

Storing Enum type in Swift

我正在为我的库 (https://github.com/JiriTrecak/Warp) 进行枚举序列化,但我在 属性 中存储枚举类型时遇到了一些困难(我需要知道该类型以便我可以序列化/按需反序列化)。

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

我试过两种方法,都不能用:

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)

在您的示例 (B) 中,即使编译器允许,也无法保证初始枚举类型与枚举类型相同 属性。

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

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

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