Swift DSL-如何根据已知的常数数据创建平面词典?

时间:2019-04-15 11:25:25

标签: ios swift dsl

我们需要将分析数据发送到服务器。它在概念上是分层的。这可能是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

的概念层次结构

问题:如何创建这样的东西将已知的静态/恒定层次数据更改为平面词典?

更新

  • 带有括号的UCL.SRP.Results.VehicleModule周围的变化,大小写不同,或者也可以。
  • 必须支持编译时间检查。
  • Analytics SDK需要使用字典作为类型。

1 个答案:

答案 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而不是使用单独的函数,请编写一个包含相同值的类。无论哪种方式,对已知部分使用枚举都会使编译器检查您始终使用有效名称。