Swift:更少的代码,嵌套的枚举案例符合相同的协议
我尝试在以下场景中编写更少的代码: 我有这个Swift:更少的代码,嵌套的枚举案例符合相同的协议,swift,generics,enums,Swift,Generics,Enums,我尝试在以下场景中编写更少的代码: 我有这个Queryable协议和一个参数枚举: 协议可查询{ var urlQuery:URLQueryItem{get} } 枚举分页参数:可查询{ 案例页面(整版) 案例页面大小(Int) 变量queryItem:URLQueryItem{ 切换自身{ 案例第页(让第页): 返回URLQueryItem(名称:“页面”,值:page.description) 大小写pageSize(让pageSize): 返回URLQueryItem(名称:“页面大小”,
Queryable
协议和一个参数
枚举:
协议可查询{
var urlQuery:URLQueryItem{get}
}
枚举分页参数:可查询{
案例页面(整版)
案例页面大小(Int)
变量queryItem:URLQueryItem{
切换自身{
案例第页(让第页):
返回URLQueryItem(名称:“页面”,值:page.description)
大小写pageSize(让pageSize):
返回URLQueryItem(名称:“页面大小”,值:pageSize.description)
}
}
}
以及一个枚举,它提供一些默认情况和一些由泛型类型定义的特定情况:
enum参数{
案例分页(分页参数)
具体情况(P)
}
示例用法
enum BookParameters:可查询{
案例搜索(字符串)
案件编号(Int)
变量urlQuery:URLQueryItem{
切换自身{
case.search(let字符串):
返回URLQueryItem(名称:“搜索”,值:字符串)
case.id(let id):
返回URLQueryItem(名称:“id”,值:id.description)
}
}
}
let参数:[参数]=[
.pagination(.pageSize(10)),
.specific(.id(123))
]
现在,我需要通过.pagination
和.specific
案例来获取url查询项
让queryItems=parameters.map({
转换$0{
大小写分页(让参数):
返回参数queryItem
具体情况(让参数):
返回参数queryItem
}
})
最好能有一种方法来处理合并的嵌套案例,因为它们符合相同的协议。这不起作用,因为我必须通过父案例转到嵌套案例:
一个小的改进是将switch语句隐藏在参数enum的扩展中,并使其符合Queryable
协议:
扩展参数:可查询{
让queryItem:URLQueryItem{
切换自身{
大小写分页(让参数):
返回参数queryItem
具体情况(让参数):
返回参数queryItem
}
}
}
这导致了一条直线,但我只是把我的问题转移到了另一个地方
let queryItems=parameters.map({$0.queryItem})
如果不将参数
与可查询项
一致,您只需在参数
中引入一个变量即可获得可查询项
,因为这两种情况都接受已符合可查询项
的类型
enum Parameter<P: Queryable> {
case pagination(PaginationParameter)
case specific(P)
var urlQuery: URLQueryItem {
switch self {
case .pagination(let param):
return param.urlQuery
case .specific(let param):
return param.urlQuery
}
}
}
enum参数{
案例分页(分页参数)
具体情况(P)
变量urlQuery:URLQueryItem{
切换自身{
大小写分页(让参数):
返回param.urlQuery
具体情况(让参数):
返回param.urlQuery
}
}
}
由于您使用的是带有关联值的嵌套枚举,我真的看不出有什么方法可以避免在顶级参数
枚举上使用这个额外的开关。就我而言,Swift并没有为我们提供一种工具来处理案例,我们可以将所有具有“相同”关联值类型的案例转换为单个案例。您可以做的是重新考虑Parameter
类型的存在,因为它似乎并不真正有用,因为您仍然需要将其称为Parameter
或Parameter
就我个人而言,我会跳过顶层枚举,直接将参数
属性类型称为[Queryable]
var参数:[可查询]=[
PaginationParameter.pageSize(10),
BookParameters.id(123)
]
使事情变得更简单,更容易推理。此外,现在还有一种方法可以添加其他类型的其他情况,而这些情况在初始解决方案中是不可能的
enum someothertypethatcomformstoqueryable:Queryable{
案例平均案例(Int)
}
parameters.append(符合可查询的其他类型。aVeryNiceCase(0))
//将此附加到类型为“[Parameter]”的数组将不正确
//无需向'Parameter'枚举显式添加新的大小写即可
另外,如果您发现自己经常调用映射{$0.queryItem}
,则可以提供数组的扩展,其中元素
是可查询的类型
扩展数组,其中元素==Queryable{
var queryItems:[URLQueryItem]{return map{$0.queryItem}
}
//现在你只需打电话
设queryItems=parameters.queryItems
True,但是我想知道是否有更简单的方法,因为在这两种情况下返回语句是相同的。想不出任何方法。