2015-10-28 28 views
0

我需要一個函數,它返回各種組合生成器函數(如過濾器和映射)的延遲生成器。例如,如果我想申請lazy.filter().map()代碼如下:通用LazyCollection類型

// 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>,但我得到類型不兼容性錯誤。鏈接更多的懶惰函數會使得類型更加複雜。更好和更適合我的需求應該是類型只有LazySomething<MyComplexType>

回答

2

是的!

你想要什麼存在,甚至有一個奇特的名字:「類型擦除」

斯威夫特有一些結構存在轉發的電話,但不能暴露(儘可能多的)墊層類型:

  • AnyBidirectionalCollection
  • AnyBidirectionalIndex
  • AnyForwardCollection
  • AnyForwardIndex
  • AnyGenerator
  • AnyRandomAccessCollection
  • AnyRandomAccessIndex
  • AnySequence

所以,你要像

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) 
} 

(因爲你的電話,說下標(2)轉發的懶惰被保留,這有時候很好,有時候不好)

然而,AnyForwardCollection在實踐中可能會更好,因爲它將會丟失許多使用懶惰集合時人們往往會遇到的方法。