我们需要将分析数据发送到服务器。它在概念上是分层的。这可能是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"
的字典键/值不是错字。
字典值中的扼杀重复是由于业务需要和他们使用的工具。
其他可能被转换的groupData
将是:
UCL.VDP.Enhanced.ActionRow
UCL.DealerMicrosite.Enhanced.ActionRow
UCL.DealerMicrosite.UCLDealerMicrosite.DealerProfile.Waze
Waze将"Value" : "Waze"
放入字典中。您可以看到,有一个 Group.SubGroup.Page.Location.Value
的概念层次结构问题:如何创建这样的东西将已知的静态/恒定层次数据更改为平面词典?
更新:
答案 0 :(得分:0)
您可以说,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
之间转换的函数就没什么大不了了。
如果元组对您的情况没有意义,例如如果您希望访问器返回一个Page
而不是使用单独的函数,请编写一个包含相同值的类。无论哪种方式,对已知部分使用枚举都会使编译器检查您始终使用有效名称。