2015-10-28 5 views
0

Мне нужна функция, которая возвращает ленивый генератор различных сгенерированных функций генератора, таких как фильтр и карта. Например, если я хочу, чтобы применить lazy.filter().map() код выглядит следующим образом:Generic LazyCollection type

// 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

Да!

То, что вы хотите, существует, и даже есть причудливое название: «тип-стирание»

Swift имеет несколько структур, которые существуют для переадресации вызовов, но не подвергать (столько) типом подстилающего:

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

Так что вы хотите (потому что ваш звонок сказать подстрочный (2) перенаправляется лень сохраняется что-то вроде

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

, который иногда бывает хорошим, иногда плохим)

Однако AnyForwardCollection может работать лучше на практике, потому что в нем будут отсутствовать многие методы, которые отключают людей при использовании ленивых коллекций.