【发布时间】:2019-04-25 12:32:02
【问题描述】:
我尝试在以下情况下编写更少的代码:
我有这个Queryable 协议和一个Parameter 枚举:
protocol Queryable {
var urlQuery: URLQueryItem { get }
}
enum PaginationParameter: Queryable {
case page(Int)
case pageSize(Int)
var queryItem: URLQueryItem {
switch self {
case .page(let page):
return URLQueryItem(name: "page", value: page.description)
case .pageSize(let pageSize):
return URLQueryItem(name: "page_size", value: pageSize.description)
}
}
}
还有一个枚举,它提供了一些默认情况和一些由泛型类型定义的特定情况:
enum Parameter<P: Queryable> {
case pagination(PaginationParameter)
case specific(P)
}
示例用法
enum BookParameters: Queryable {
case search(String)
case id(Int)
var urlQuery: URLQueryItem {
switch self {
case .search(let string):
return URLQueryItem(name: "search", value: string)
case .id(let id):
return URLQueryItem(name: "id", value: id.description)
}
}
}
let parameters: [Parameter<BookParameters>] = [
.pagination(.pageSize(10)),
.specific(.id(123))
]
现在我需要通过.pagination和.specific这两种情况来获取url查询项。
let queryItems = parameters.map({
switch $0 {
case .pagination(let param):
return param.queryItem
case .specific(let param):
return param.queryItem
}
})
最好有一种方法来处理嵌套的 case 组合,因为它们符合相同的协议。这不起作用,因为我必须通过父案例转到嵌套案例:
一个小的改进是将 switch 语句隐藏在参数枚举的扩展中,并让它也符合 Queryable 协议:
extension Parameters: Queryable {
let queryItem: URLQueryItem {
switch self {
case .pagination(let param):
return param.queryItem
case .specific(let param):
return param.queryItem
}
}
}
这导致了一个班轮,但我只是将我的问题转移到了另一个地方。
let queryItems = parameters.map({ $0.queryItem })
【问题讨论】: