public class _AnyIteratorBase { } /// An abstract `IteratorProtocol` base class over `T` elements. /// /// Use this as a `Sequence`'s associated `Iterator` type when you /// don't want to expose details of the concrete iterator, a subclass. /// /// It is an error to create instances of `AnyIterator` that are not /// also instances of an `AnyIterator` subclass. /// /// See also: /// /// struct AnySequence /// func anyIterator(base: I) -> AnyIterator /// func anyIterator(nextImplementation: () -> T?) -> AnyIterator public class AnyIterator : _AnyIteratorBase, IteratorProtocol { /// Initialize the instance. May only be called from a subclass /// initializer. override public init() /// Advance to the next element and return it, or `nil` if no next /// element exists. /// /// Note: subclasses must override this method. public func next() -> T? } /// Every `IteratorProtocol` can also be a `Sequence`. Note that /// traversing the sequence consumes the iterator. extension AnyIterator : Sequence { /// Returns `self`. public func makeIterator() -> AnyIterator } /// Return a `IteratorProtocol` instance that wraps `base` but whose type /// depends only on the type of `I.Element`. /// /// Example: /// /// func countStrings() -> AnyIterator { /// let lazyStrings = lazy(0..<10).map { String($0) } /// /// // This is a really complicated type of no interest to our /// // clients. /// let g: MapSequenceIterator, String> /// = lazyStrings.makeIterator() /// return anyIterator(g) /// } public func anyIterator(base: I) -> AnyIterator public class FooIteratorBox< Base: IteratorProtocol > : AnyIterator { /// Advance to the next element and return it, or `nil` if no next /// element exists. /// /// Note: subclasses must override this method. public override func next() -> Base.Element? }