0

我正在为我的库(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)

4

1 回答 1

1

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

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

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

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

于 2016-06-21T10:15:44.330 回答