Реализация расширения rotateLeft для быстрых последовательностей - PullRequest
1 голос
/ 07 января 2020

Я пытаюсь реализовать расширение для последовательности, которая вращает элементы от начала последовательности до конца, например:

[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.

1 Ответ

1 голос
/ 07 января 2020

Я заставил его работать, явно набрав промежуточные шаги:

extension Sequence {
  func rotateLeft(_ n:Int) -> AnySequence<Iterator.Element> {
    let s1 = AnySequence<Iterator.Element>(self.dropFirst(n))
    let s2 = AnySequence<Iterator.Element>(self.prefix(n))
    return AnySequence<Iterator.Element>([s1, s2].joined())
  }
}

, но я должен признать, что не могу действительно ответить на вопрос "почему".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...