【问题标题】:Storing Enum type in Swift在 Swift 中存储枚举类型
【发布时间】:2016-06-21 09:08:43
【问题描述】:

我正在为我的库 (https://github.com/JiriTrecak/Warp) 进行 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)

【问题讨论】:

    标签: swift generics enums rawrepresentable


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

    【讨论】:

    • 但是,当我将它存储为 Any 时,我不能用原始值分配它,因为它没有初始化程序(因为我不知道它应该符合该协议)而且我不能force-type 强制转换它,因为 Any 不能以这种方式转换。我错过了什么?
    • 我不清楚你的意思。你可以像这样投射:wrp.enumType as? WRPEnum 你也可以分配wrp.enumType = WRPEnum(rawValue: 1)。不会发生的是利用泛型来确保 enumType 始终与 init 类型 T 相同。相反,您需要测试 enumType 是什么类型。
    • 谢谢,非常有帮助。我将不得不重新考虑如何处理某些事情,这将需要对目前的处理方式进行一些重大修改。该解决方案可行,但它非常老套,我宁愿花更多时间改进它,即使这意味着一些核心概念会发生变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多