带有开关的通用枚举

时间:2018-09-20 14:59:38

标签: swift enums

我有以下枚举

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字段。

2 个答案:

答案 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
    }
}

但是,当然,您可能需要将当前具有的不同类型用作关联值,这将是不可能的。