Struct或Enum用于序列化键?

时间:2014-12-25 17:08:11

标签: ios swift

为什么Apple更喜欢在Lister演示中使用结构来声明序列化键?可能会有一些好处吗?

例如:

private struct SerializationKeys {
    static let text = "text"
    static let uuid = "uuid"
    static let completed = "completed"
    ...
    //duplicated key!
    static let descriptionText = "text"
}

这里我们可能有重复的密钥。对于小对象来说这不是一个大问题(不要忘记复制/粘贴:)),但对于具有数十个字段的大型对象,这可能是一个真正的问题。

使用枚举我们不会遇到这样的问题:

    private enum SerializationKeys : String {
    case text = "text"
    case uuid = "uuid"
    case completed = "completed"
    //...
    case descriptionText = "text"
    //here we have compiler's warning: Raw value for enum case is not unique
}

很高兴听到一些关于此的想法。

2 个答案:

答案 0 :(得分:6)

我有时会做同样的事情,这就是原因。

使用结构,我的值可以直接使用:因此,如果SerializationKeys是一个结构,那么SerializationKeys.text就是一个字符串。

但是对于枚举,枚举就是价值。如果SerializationKeys是枚举,那么SerializationKeys.text 不是一个字符串;它是一个枚举。如果我想要字符串,我必须明确地获取它,作为枚举rawValue。有时,这太过于坚果了。另一方面,如果它是可以接受的,或者为什么这是一个好的枚举的另一个原因,那么很好,我会使用枚举。

换句话说:如果这只是某些常量的美化命名空间,那么带静态成员的结构似乎最简单。枚举用于开关,即需要以几种可能状态之一存在的东西。

答案 1 :(得分:3)

Apple在这里选择struct的理由似乎纯粹是语义上的。 SerializationKeys.descriptionText是一个属性。 SerializationKey.DescriptionText是一种类型。使用类型作为是一种语义上的怪异。

是的,在这个特定的例子中,SerializationKey.DescriptionText类型碰巧有一个" raw"与之相关的价值。但据我了解,原始值实际上只是用作一种“桥接层”。 C枚举之间的层。将它用于像这样的键是一种黑客攻击。