Swift懒惰的下标忽略了过滤器

Max*_*Max 7 lazy-evaluation swift

如何订阅延迟过滤器?

let ary = [0,1,2,3]
let empty = ary.lazy.filter { $0 > 4 }.map { $0 + 1 }
print(Array(empty)) // []
print(empty[2])     // 3
Run Code Online (Sandbox Code Playgroud)

看起来它只是忽略了过滤器并且无论如何都要做地图.这是在某处记录的吗?还有哪些懒惰的藏品有这样的特殊行为?

iel*_*ani 7

归结为LazyFilterCollection用整数下标 a在这种情况下忽略谓词并将下标操作转发到基数。

例如,如果我们在数组中寻找严格的正整数:

let array = [-10, 10, 20, 30]
let lazyFilter = array.lazy.filter { $0 > 0 }

print(lazyFilter[3])                 // 30
Run Code Online (Sandbox Code Playgroud)

或者,如果我们要查找字符串中的小写字符:

let str = "Hello"
let lazyFilter = str.lazy.filter { $0 > "Z" }

print(lazyFilter[str.startIndex])    //H
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,下标都被转发到基础集合。

下标 a 的正确方法LazyFilterCollection是使用文档LazyFilterCollection<Base>.Index中所述的a :

let start = lazyFilter.startIndex
let index = lazyFilter.index(start, offsetBy: 1)
print(lazyFilter[index])  
Run Code Online (Sandbox Code Playgroud)

这产生20了数组示例或l字符串示例。


在您的情况下,尝试访问索引3

let start = empty.startIndex
let index = empty.index(start, offsetBy: 3)
print(empty)
Run Code Online (Sandbox Code Playgroud)

会引发预期的运行时错误:

致命错误:索引超出范围