在 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
问题是如何合并两个表达式的结果?
- 筛选出类型为
LazyFilterSequence<[Int]>?
的 queryModulus.map { modulus in values.filter { [=15=] % modulus == 0 } }
- 第一个
values
类型 LazySequence<[Int]>
通过快速研究,我意识到错误会出现在任何集合中。
这意味着 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
在实现自定义过滤值时我遇到了问题。 当我尝试合并 来自过滤和未过滤的 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
问题是如何合并两个表达式的结果?
- 筛选出类型为
LazyFilterSequence<[Int]>?
的 - 第一个
values
类型LazySequence<[Int]>
queryModulus.map { modulus in values.filter { [=15=] % modulus == 0 } }
通过快速研究,我意识到错误会出现在任何集合中。
这意味着 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