1

我需要一个函数来返回各种组合生成器函数(如过滤器和映射)的惰性生成器。例如,如果我想应用lazy.filter().map()代码如下所示:

// Simplified
typealias MyComplexType = Int
typealias MyComplexCollection = [MyComplexType]

func selection() -> LazyMapCollection<LazyFilterCollection<MyComplexCollection>, Int> {
    let objects:MyComplexCollection = [1, 2, 3, 4, 5, 6]
    let result = objects.lazy.filter({$0 < 4}).map({$0 * 10})

    return result
}

for obj in someObjects() {
    print(obj)
}

有没有更通用的方法来指定LazyMapCollection<LazyFilterCollection<MyComplexCollection>, Int>? 我试过LazyGenerator<MyComplexCollection>了,但出现类型不兼容错误。链接更多惰性函数会使类型更加复杂。更好和更适合我的需要是有一个类似于 just 的类型LazySomething<MyComplexType>

4

1 回答 1

2

是的!

你想要的存在,甚至还有一个花哨的名字:“type-erasure”

Swift 有一些结构可以转发调用,但不暴露(尽可能多的)底层类型:

  • AnyBidirectionalCollection
  • 任意双向索引
  • AnyForwardCollection
  • AnyForwardIndex
  • 任何发电机
  • AnyRandomAccessCollection
  • AnyRandomAccessIndex
  • 任意序列

所以你想要类似的东西

func selection() -> AnySequence<MyComplexType> {
    let objects:MyComplexCollection = [1, 2, 3, 4, 5, 6]
    let result = objects.lazy.filter({$0 < 4}).map({$0 * 10})

    return AnySequence(result)
}

(因为你的电话说 subscript(2) 被转发了惰性被保留,这有时是好的,有时是坏的)

然而,AnyForwardCollection 在实践中可能会更好,因为它会丢失许多在使用惰性集合时会绊倒人们的方法。

于 2015-10-29T14:59:28.837 回答