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)
看起来它只是忽略了过滤器并且无论如何都要做地图.这是在某处记录的吗?还有哪些懒惰的藏品有这样的特殊行为?
归结为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)
会引发预期的运行时错误:
致命错误:索引超出范围