在 Swift 中统一接口 LazySequence<T> 和 LazyFilteredSequence<T>

Unifying interfaces LazySequence<T> and LazyFilteredSequence<T> in Swift

在实现自定义过滤值时我遇到了问题。 当我尝试合并 来自过滤和未过滤的 LazySequences 的结果时出现。

这里是说明问题的示例:

let queryModulus: Int? = 10 // Sometimes may be **nil**
let values = [1, 2, 3, 4, 5, 6].lazy // Actually comes from **external** source

let filteredValues = queryModulus.map { modulus in 
    values.filter { [=13=] % modulus == 0 } 
} ?? values // Error appears on this statement

当编译上面的片段时,编译器给我错误:

.code.tio.swift:4:59: error: cannot convert value of type 'LazyFilterSequence<[Int]>' to closure result type 'LazySequence<[Int]>'
let filteredValues = queryModulus.map { modulus in values.filter { [=14=] % modulus == 0 } } ?? values // Error appears on this statement
                                                   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/srv/wrappers/swift4: line 5: ./.bin.tio: No such file or directory

问题是如何合并两个表达式的结果?

通过快速研究,我意识到错误会出现在任何集合中。 这意味着 LazySequence<T>LazyFilteredSequence<T>Set 和其他人不兼容。

你可以try.it

您只需将 .lazy 添加到 .map 中的 .filter,然后添加 .map 和 [=16= 的 return 类型] 将相同。

let filteredValues = queryModulus.map { modulus in
    values.filter { [=10=] % modulus == 0 }.lazy
} ?? values

如果您的 values 有一个 Set.lazy,在您的 map 中,您首先需要将 filter 的结果转换为新的 Set 然后在上面调用 lazy

let setValues = Set([1, 2, 3, 4, 5, 6]).lazy
let filtered2 = queryModulus.map { mod in Set(setValues.filter { [=11=] % mod == 0}).lazy } ?? setValues