我正在为我的库(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)
答案 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。这为您提供了您正在寻找的动态能力(尽管最佳解决方案可能是重构您的方法,以便在实例化时可以设置枚举类型)。