Я пытаюсь реализовать расширение для последовательности, которая вращает элементы от начала последовательности до конца, например:
[1,2,3,4].rotateLeft(2)
дает последовательность вроде [3,4,1,2]
.
Пока что у меня есть:
extension Sequence {
func rotateLeft(_ n:Int) -> AnySequence<Iterator.Element> {
return AnySequence([self.dropFirst(n), self.prefix(n)].joined())
}
}
Но здесь есть проблема с печатанием:
строка: 3: столбец: 64: (.joined
): тип выражения неоднозначен без дополнительного контекста
Мне не повезло, поиск в поиске ответов - большинство ответов на проблемы с типами задаются c для задействованных типов, а примеры rotateLeft основаны на массивах, а не на последовательностях .
Извлечение последовательностей, которые нужно объединить, и ввод их так:
let sequencesToJoin: [AnySequence<Iterator.Element>] = [self.dropFirst(n), self.prefix(n)]
Выдает ошибки:
Невозможно преобразовать значение типа 'DropFirstSequence<Self>
'к ожидаемому типу элемента' AnySequence<Self.Element>
'
Невозможно преобразовать значение типа' PrefixSequence<Self>
'в ожидаемый тип элемента' AnySequence<Self.Element>
'
Я хотел бы понять что происходит с дженериками. Похоже, последовательности, возвращаемые из dropFirst
и prefix
, являются последовательностями с типом элемента, представляющим собой последовательность (что-то вроде DropFirstSequence<Sequence>
), что кажется странным, и, возможно, проблема. Я ожидаю, что эти методы будут возвращать что-то вроде DropFirstSequence<Element>
...
К вашему сведению, я использую Xcode 11.3 (11C29)
и Swift 5 с целью iOS.