Все сводится к подписке LazyFilterCollection
с целым числом, которое в этом случае игнорирует предикат и перенаправляет операцию индексации на базу.
Например, если мы ищем строго положительные целые числа в массиве:
let array = [-10, 10, 20, 30]
let lazyFilter = array.lazy.filter { $0 > 0 }
print(lazyFilter[3]) // 30
Или, если мы ищем строчные символы в строке:
let str = "Hello"
let lazyFilter = str.lazy.filter { $0 > "Z" }
print(lazyFilter[str.startIndex]) //H
В обоих случаях нижний индекс перенаправляется в базовую коллекцию.
Правильный способ подписки LazyFilterCollection
- это использование LazyFilterCollection<Base>.Index
, как описано в документации :
let start = lazyFilter.startIndex
let index = lazyFilter.index(start, offsetBy: 1)
print(lazyFilter[index])
Что дает 20
для примера массива или l
для примера строки.
В вашем случае попытка получить доступ к индексу 3
:
let start = empty.startIndex
let index = empty.index(start, offsetBy: 3)
print(empty)
вызовет ожидаемую ошибку времени выполнения:
Неустранимая ошибка: индекс выходит за пределы диапазона