Как расширить универсальный класс для всех типов, которые НЕ соответствуют определенному протоколу? - PullRequest
0 голосов
/ 31 марта 2019

У меня есть общий класс:

class MyGeneric<Item>
{
}

Я хотел бы добавить метод расширения для всех типов, которые, скажем, не Числовые .

Примерно так (псевдокод):

extension MyGeneric where Item: !Numeric
{
   func myFuncForNonNumeric()
   {
      print("I am not Numeric!")
   }
}

Есть ли способ указать такие ограничения?

1 Ответ

4 голосов
/ 31 марта 2019

Нет, нет никакого способа сказать "нет" в ограничениях типа Swift.

Тем не менее, для чего вы бы это использовали?Какой алгоритм можно применить к классу типов «не числовой», который нельзя применить к числовым типам?Класс типов «не числовой» не имеет методов для использования.

Эта концепция также проблематична, поскольку типы могут соответствовать протоколам в произвольных местах и ​​в пределах области видимости, равной размеру файла.Например, если один модуль внутренне соответствует типу Numeric, как MyGeneric должен вести себя в других модулях?

Как это будет вести себя для MyGeneric<CustomStringConvertible>?Int - это CustomStringConvertible, поэтому Item может быть Int в экзистенциале CustomStringConvertible.Этот метод существует?(Очевидный ответ - да, потому что CustomStringConvertible не является числовым, но вы это имеете в виду? Чем это полезно?)

Я хочу пояснить, что все эти вопросы не означают, что ваше первоначальное желаниенеправильно или невозможно.С осторожной мыслью, это может быть возможно и полезно. И в этом случае, в идеале, Swift должен был бы развиваться, чтобы поддерживать его. Но это часто указывает на несоответствие между инструментом, который вы ищете, и проблемой, которую вы действительно пытаетесь решить, так что это полезночтобы исследовать это подробнее.

...