Сделать параметр функции типом протокола, который также соответствует протоколу - PullRequest
0 голосов
/ 25 июня 2019

Я хочу создать функцию, которая принимает параметр типа протокола и убедиться, что этот тип протокола также соответствует другому типу протокола.Есть ли способ, которым я могу сделать это?Или я должен фундаментально переосмыслить свой подход здесь?

Пример:

// This doesn't extend CaseIterable itself because I would like to use it as a concrete type and not just a generic constraint
protocol MyProtocol {
    /*some protocol stuff*/
}

enum myEnum: MyProtocol, CaseIterable {
    /*some enum stuff*/
}

func<T: CaseIterable>(_ myEnum: MyProtocol.Type) 
where MyProtocol.Type: CaseIterable {
    myEnum.allCases //   <--- This is what I would like to do
}

1 Ответ

0 голосов
/ 25 июня 2019

Вам необходимо изменить сигнатуру функции, чтобы использовать ограничение универсального типа в качестве типа входного аргумента и ограничить параметр универсального типа равным MyProtocol и CaseIterable.

func enumFunc<T: MyProtocol & CaseIterable>(_ myEnum: T.Type) {
    myEnum.allCases //   <--- This is what I would like to do
}
...