Как указать тип параметра функции с комбинированным типом CustomStringConvertible и RawRepresentable? - PullRequest
1 голос
/ 27 марта 2020

Мне нужна универсальная c функция, которая может создавать экземпляры объекта нескольких различных enum типов, которые у меня есть, предоставляя тип enum и необработанное значение Int. Эти enum s также CustomStringConvertible.

Я пробовал это:

func myFunc(type: CustomStringConvertible.Type & RawRepresentable.Type, rawValue: Int)

, что приводит к 3 ошибкам:

  • Не протокол, не -класс типа 'CustomStringConvertible.Type' не может использоваться в типе с ограничением протокола
  • Недопустимый тип без класса 'RawRepresentable.Type' не может использоваться в типе с ограничением протокола
  • Протокол 'RawRepresentable' может использоваться только в качестве общего c ограничения, поскольку он имеет собственные требования или связанные с ними требования к типу

На данный момент забывая о CustomStringConvertible`, я также попытался:

private func myFunc<T: RawRepresentable>(rawValue: Int, skipList: [T]) {
    let thing = T.init(rawValue: rawValue)
}

Но, хотя завершение кода предполагает это, приводит к ошибке о T.init(rawValue:):

  • Невозможно вызвать 'init' со списком аргументов типа '(rawValue: Int)'

Как я могу создать работающую обобщенную c функцию, подобную этой?

1 Ответ

2 голосов
/ 27 марта 2020

Проблема в том, что T.RawValue может быть чем-то иным, чем Int с вашими текущими ограничениями типов. Вам необходимо указать, что T.RawValue == Int, чтобы передать входной параметр rawValue: Int в init(rawValue:).

func myFunc<T: RawRepresentable & CustomStringConvertible>(rawValue: Int, skipList: [T]) where T.RawValue == Int {
    let thing = T.init(rawValue: rawValue)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...