作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下枚举
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/
我是一名优秀的程序员,十分优秀!