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
将被转换为:
UCL.VDP.Enhanced.ActionRow
UCL.DealerMicrosite.Enhanced.ActionRow
UCL.DealerMicrosite.UCLDealerMicrosite.DealerProfile.Waze
Waze 将 "Value" : "Waze"
放入字典。
如您所知,概念层次结构为 Group.SubGroup.Page.Location.Value
问题:如何创建这样一种东西,将已知的 static/constant 分层数据更改为平面字典?
更新:
- 围绕 UCL.SRP.Results.VehicleModule 的变体,包括括号、不同的大小写,或者任何其他都可以。
- 必须支持编译时检查。
- Analytics SDK 需要字典作为类型。
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 包含相同的值。无论哪种方式,对已知部分使用枚举都会让编译器检查您是否始终使用有效名称。
我们需要将分析数据发送到服务器。它在概念上是分层的。这可能是一个 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
将被转换为:
UCL.VDP.Enhanced.ActionRow
UCL.DealerMicrosite.Enhanced.ActionRow
UCL.DealerMicrosite.UCLDealerMicrosite.DealerProfile.Waze
Waze 将"Value" : "Waze"
放入字典。
如您所知,概念层次结构为 Group.SubGroup.Page.Location.Value
问题:如何创建这样一种东西,将已知的 static/constant 分层数据更改为平面字典?
更新:
- 围绕 UCL.SRP.Results.VehicleModule 的变体,包括括号、不同的大小写,或者任何其他都可以。
- 必须支持编译时检查。
- Analytics SDK 需要字典作为类型。
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 包含相同的值。无论哪种方式,对已知部分使用枚举都会让编译器检查您是否始终使用有效名称。