Написание обобщенной c функции для получения общей переменной из нескольких перечислений в Swift - PullRequest
0 голосов
/ 04 мая 2020

Я хочу написать обобщенный c метод, который может обращаться к нескольким случаям перечисления, а также к их общим переменным.

    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».

Мой поток кода сложен для объяснения, но мне определенно нужен этот метод для сохранения тысячи строк. Может ли кто-нибудь помочь мне в этом?

1 Ответ

2 голосов
/ 04 мая 2020

Прежде всего, вам нужно создать CommonEnum protocol с ourVar в качестве одного из требований, например:

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

Теперь приведите соответствие protocol в MyEnum и YourEnum,

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
...