Я пишу функцию, которая принимает в качестве параметра как Array<Int>
, так и ArraySlice<Int>
. Функция полагается на сопоставимые элементы (на самом деле Int
) и индексы с целочисленными индексами, что подразумевается как Array
, так и ArraySlice
. Мне удалось найти пересечение между этими двумя типами в RandomAccessCollection
.
К сожалению, я не могу просто использовать RandomAccessCollection<Int>
: (Ошибка следующая: «Невозможно выделить не-общий тип c 'RandomAccessCollection' "). Вместо этого мне пришлось сделать следующее длинное объявление:
func functionName<T>(
arr: T
) -> T.Element where T: RandomAccessCollection, T.Element: Comparable, T.Index == Int {
// implementation
}
Я хотел бы по возможности упростить объявление функции. В идеале хотелось бы сделать его настолько чистым, насколько это были бы принимающие массивы: func functionName(_ arr: [Int]) -> Int
). Возможно ли это?
Основная причина для принятия обоих типов следующая: при написании алгоритма функция часто принимает массив, но ей нужно сделать рекурсивный вызов самой себе с помощью фрагмента массива. Поскольку некрасиво ограничивать publi c API функции до ArraySlice
, вам придется либо возиться с универсальными шаблонами (как описано выше), либо создавать вложенную функцию, которая принимает фрагмент массива и вызывать его вместо этого (или создавать новый массив из фрагмента массива что тоже не кажется правильным). Оба варианта создают ненужную сложность для простой работы.