我有以下枚举
moment().weekday(0)
这段代码很丑陋,我不得不在开关中重复这些情况,因为每次参数都是不同的类型。但是所有参数都遵循“可编码”协议。
必须使用某种通用类型来避免这种情况。
所有编码函数的声明如下:
enum MoneyCupUsersBackEndRouter: URLRequestConvertible {
case getInfo
case postUserConnection(ConnectionData)
case postPersonalInfo(UserUpdatePersonalInformationsRequest)
case postKycAnswers(QuestionnaireAnswers)
switch self {
case .postUserConnection(let parameters):
let r = parameters.encode()
print(r)
case .postPersonalInfo(let parameters):
let r = parameters.encode()
print(r)
case .postKycAnswers(let parameters):
let r = parameters.encode()
print(r)
default:
break
}
返回的字典包含struc字段。
答案 0 :(得分:1)
如果所有关联的类型均符合通用协议Foo
(具有encode()
方法),然后可以使用as Foo
模式来关联值,以将所有情况组合成一个个案。
这是一个独立的示例(已通过Xcode 10 / Swift 4.2测试):
protocol Foo {
func encode() -> [String: Any]
}
class A: Foo {
func encode() -> [String: Any] { return ["A": 1] }
}
class B: Foo {
func encode() -> [String: Any] { return ["B": 2] }
}
class C: Foo {
func encode() -> [String: Any] { return ["C": 3] }
}
enum MyEnum {
case a(A)
case b(B)
case c(C)
func test() {
switch self {
case .a(let parameters as Foo),
.b(let parameters as Foo),
.c(let parameters as Foo):
let r = parameters.encode()
print(r)
}
}
}
MyEnum.a(A()).test() // ["A": 1]
MyEnum.b(B()).test() // ["B": 2]
MyEnum.c(C()).test() // ["C": 3]
答案 1 :(得分:0)
如果您只需要一个可编码的参数,则可以尝试-
case getInfo
case postUserConnection(Codable)
case postPersonalInfo(Codable)
case postKycAnswers(Codable)
然后-
func stuff() {
switch self {
case .postUserConnection(let parameters), .postPersonalInfo(let parameters), .postKycAnswers(let parameters):
let r = try? parameters.encode()
print(r as Any)
default:
break
}
}
但是,当然,您可能需要将当前具有的不同类型用作关联值,这将是不可能的。