gpt4 book ai didi

swift - 带有 switch swift 的通用枚举

转载 作者:行者123 更新时间:2023-11-28 05:52:27 25 4
gpt4 key购买 nike

我有以下枚举

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
}

这段代码非常丑陋,我不得不在 switch 中复制 case,因为每次,参数都是不同的类型。但是所有参数都遵循“可编码”协议(protocol)。

必须有一种方法可以通过使用某种通用类型来避免这种情况。

所有编码函数的声明如下:

func encode() -> [String: Any] {
return ["id": id, "data": data]
}

返回的字典包含结构字段。

最佳答案

如果所有关联类型都符合一个通用协议(protocol)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]

关于swift - 带有 switch swift 的通用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52428073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com