Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:更少的代码,嵌套的枚举案例符合相同的协议_Swift_Generics_Enums - Fatal编程技术网

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,但是我想知道是否有更简单的方法,因为在这两种情况下返回语句是相同的。想不出任何方法。