如何使用索引访问惰性序列?

How do I access a lazy sequence with an index?

我今天注意到这种关于惰性序列的行为:

// filtered will be [2, 4, 6, 8]
let filtered = [1,2,3,4,5,6,7,8].lazy.filter { [=10=] % 2 == 0 }
print(filtered[2]) // expecting 6, but prints 3

我明白为什么它给了我 3。下标可能只知道惰性包装器下面的序列,所以它 returns 来自原始未过滤序列的元素。但是,否则我将如何访问第三个元素?

上下文:

我正在根据 Realm 查询结果构建一个 table 视图,我应用了一个额外的过滤器,因为 Realm 不支持我尝试执行的过滤器。因此我现在有一个LazyFilterSequence<Results<MyRealmObject>>。在 cellForRowAt 中,我需要通过索引访问惰性序列,以便我知道在每个 table 单元格中显示什么。

您可以通过与 类似的方式访问它们,即使用 index(_:offsetBy:):

filtered[filtered.index(filtered.startIndex, offsetBy: 2)]

访问惰性过滤器序列与访问字符串非常相似,因为两者都不是 O(1)。

或者,删除前 n 个项目,然后访问第一个项目:

filtered.dropFirst(2).first

但我更喜欢第一个,因为在我看来,仅仅为了访问一个集合而“丢弃”东西是很奇怪的。