在Swift中编写一个通用函数来从多个枚举中获取通用变量。

问题描述 投票:0回答:1

我想写一个通用方法,它可以访问多个枚举的情况以及它们的公共变量。

    enum MyEnum:String,CaseIterable {
        case a = "a"

        var ourVar:MyAnotherEnum {
            switch self {
            case .a:
                return MyAnotherEnum.a1
            }
        }
    }

    enum MyAnotherEnum:String,CaseIterable {
        case a1 = "a1"
    }


    enum YourEnum:String,CaseIterable {
        case b = "b"

        var ourVar:YourAnotherEnum {
            switch self {
            case .b:
                return YourAnotherEnum.b1
            }
        }
    }

    enum YourAnotherEnum:String,CaseIterable {
        case b1 = "b1"
    }

我的和你的枚举都有 "ourVar "作为公共变量。现在,我想写一个方法,如果我传递一个枚举,它可以打印所有的值。类似这样的方法。

printAll(MyEnum.self) //Should print "a" and "a1"

我试着对一个枚举进行迭代,比如:

    func printAll<T>(_ id:T.Type) where T:RawRepresentable, T:CaseIterable {
        for c in T.allCases {
            print(c.rawValue) //Prints the value correctly
            print(c.ourVar) //Throws error "Value of type 'T' has no member 'ourVar'"
        }
    }

我的期望是: printAll(myEnum) 应该打印 "a "和 "a1"。

我的代码流程很复杂,无法解释,但我肯定需要这个方法来节省上千行。谁能帮帮我?

swift variables generics enums
1个回答
2
投票

首先,你需要创建一个 CommonEnum protocolourVar 作为其中一项要求,如:

protocol CommonEnum {
    associatedtype T
    var ourVar: T { get }
}

现在符合上述 protocolMyEnumYourEnum,

enum MyEnum: String, CaseIterable, CommonEnum {
    //....
}


enum YourEnum: String,CaseIterable, CommonEnum {
    //....
}

下一步, printAll(_:) 方法将

func printAll<T>(_ id: T.Type) where T: CommonEnum & RawRepresentable & CaseIterable {
    for c in T.allCases {
        print(c.rawValue)
        print(c.ourVar)
    }
}

例如:

printAll(MyEnum.self) //prints a and a1
© www.soinside.com 2019 - 2024. All rights reserved.