Массив ClosedRange <Int>и ReverseCollection - PullRequest
0 голосов
/ 14 января 2020

Я могу легко перебирать элементы закрытого диапазона. То же самое для элементов reversed() закрытого диапазона. Тем не менее, эти две конструкции имеют разные типы, такие как ClosedRange<Int> для первого и ReverseCollection<ClosedRange<Int>>.

Предположим, мне нужна какая-то коллекция (например, массив), включающая в себя как диапазоны, так и обратные диапазоны: как бы я go об этом?

Пример:

let aaa = 1...3
let bbb = (4...6).reversed()
let ranges = [aaa,bbb]  // heterogeneous collection literal could only be inferred of type '[Any]'
for range in ranges {
  for item in range {
    print(item)
  }
}

Простое объявление ranges типа [Sequence] или [Collection] не работает, потому что " Протокол «Последовательность» может использоваться только в качестве общего ограничения c, поскольку он имеет требования к «Я» или связанные с ним типы ».

Ответы [ 2 ]

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

Вы можете использовать AnySequence:

let aaa = AnySequence(1...3)
let bbb = AnySequence((4...6).reversed())
let ranges = [aaa, bbb] // ranges is [AnySequence<Int>]
for range in ranges {
  for item in range {
    print(item)
  }
}
1 голос
/ 14 января 2020

Вам потребуется преобразовать все элементы в один и тот же тип либо Array или AnySequence, в зависимости от ваших проблем с производительностью. Array создаст новое хранилище, но при обратной последовательности может иметь лучшую производительность. AnySequence просто перенаправляет операции в свой базовый класс, таким образом, в зависимости от размера вашей последовательности, может быть вычислительно сложным.

let aaa = Array(1...3)
let bbb = Array((4...6).reversed())

let ranges = [aaa, bbb]
for range in ranges {
    for item in range {
        print(item)
    }
}
...