【发布时间】:2017-01-01 00:33:19
【问题描述】:
我正在遵循我遇到的一种设计,它使用 Enum 以一种公开优雅 API 的方式实质上构建网络请求。基本上,它利用关联的值来逐步构建发送到 Alamofire 函数调用的信息(以 Enum 上的计算属性的形式)。
我遇到的问题是枚举中的每个计算属性实际上都需要与案例的关联值不同的值。
所以如果我声明一个端点endpoint1(path: String, param1: String),path 属性将只访问第一个值。不幸的是,考虑到 Swift Enums 的工作方式,似乎我必须为每个打开的案例公开所有关联的值。这会导致未使用的变量,因此一定是不正确的。因此,我正在考虑刮除这种方法。
作为参考,这是我的代码,它使用 Enum 案例来形成概念性网络端点。可以像 Endpoint1(path: users/, format: "JSON") 这样调用。
public enum Endpoints {
case Endpoint1(path: Sring, param1Value: String)
public var method: HttpMethod {
switch self {
case .Endpoint1,
return HttpMethod.GET
}
}
public var path: String {
switch self {
case .Endpoint1(let path, let paramValue1):
return baseURL + path
}
}
public var parameters: [String : AnyObject] {
var parameters = ["param1" : "..."]
switch self {
case .Endpoint1(let path, let param1Value):
parameters["param1"] = param1Value
break
}
return parameters
}
}
所以问题是path 属性不需要paramValue1 关联值,而parameters 属性不需要path 关联值。
尽管有点复杂,但我实际上喜欢这种以这种方式使用 Enum 功能的技术。不幸的是,它们功能的这一方面似乎是一条死胡同。有没有办法可以重构它以正确使用 Swift 枚举?
【问题讨论】: