Swift DSL - 如何用已知常量数据创建平面字典?

Swift DSL - How to Create a Flat Dictionary Out of Known Constant Data?

我们需要将分析数据发送到服务器。它在概念上是分层的。这可能是一个 Swift DSL(领域特定语言)问题。

我们想要支持的示例方法调用是:

trackEvent(name: UCL.tapSaveCar, groupData: UCL.SRP.Results.VehicleModule)

groupData是本题的重点

作为其处理的一部分,trackEvent 将从这个 UCL.SRP.Results.VehicleModule 中创建一个平面字典,如下所示:

["Group": "UCL", "SubGroup" : "SRP", "Page" : "UCL SRP Results", "Location" : "UCL SRP Results : Vehicle Module", "Value" : ""]

:"Location" : "UCL SRP Results : Vehicle Module"的字典key/value不是错字

字典值中的扼杀重复是由于业务需求和他们使用的工具。

其他可能的 groupData 将被转换为:

如您所知,概念层次结构为 Group.SubGroup.Page.Location.Value

问题:如何创建这样一种东西,将已知的 static/constant 分层数据更改为平面字典?

更新

As you can tell, there's a conceptual hierarchy of Group.SubGroup.Page.Location.Value

对我来说,这看起来像 Tuple。你总是有相同的元素列表,对吧?当您有许多任意键值对时,字典非常有用,但如果键总是相同(例如组、子组、页面等),那么您应该考虑使用元组。而且由于这些值显然也都是已知的,因此使用枚举可能是有意义的。这是一个示例(带有一些额外的虚构值):

enum Group {
    case UCL, LCL, LCP, DDO
}

enum Subgroup {
    case SRP, VDP, DealerMicrosite
}

enum Location {
    case DealerProfile, ActionRow, VehicleModule
}

typealias GroupData = (group: Group, 
                       subgroup: Subgroup,
                       page: String,
                       location: Location,
                       value = String)

我在这里使用 String 作为页面和值组件,因为不清楚它们是否定义明确。页面似乎由组、子组和第三方组成;如果第三部分是可枚举的,那么您当然可以为此使用枚举。当然,价值也一样。

一旦你定义了它,那么编写在 Group.SubGroup.Page.Location.Value 格式和 GroupData.

格式之间转换的函数应该没什么大不了的

如果元组对您的情况没有意义,例如如果你想要一个 returns 和 Page 的访问器而不是使用单独的函数,那么写一个 class 包含相同的值。无论哪种方式,对已知部分使用枚举都会让编译器检查您是否始终使用有效名称。