[swift-evolution] [Proposal] More Powerful Constraints for Associated Types

Dmitri Gribenko gribozavr at gmail.com
Fri Apr 29 10:51:11 CDT 2016

On Fri, Apr 29, 2016 at 4:02 AM, David Hart <david at hartbit.com> wrote:
> But Collection has to have an extension which explicitly mentions
> IndexingIterator:
> extension Collection where Iterator == IndexingIterator<Self> {
>     /// Returns an iterator over the elements of the collection.
>     public func makeIterator() -> IndexingIterator<Self> {
>         return IndexingIterator(_elements: self)
>     }
> }
> And Array, for example, has to be explicit:
> public typealias Iterator = IndexingIterator<${Self}>

This might be a workaround for a compiler bug (that it couldn't infer the type).

> So I still don’t see how defining:
> associatedtype Iterator : IteratorProtocol = IndexingIterator<Self>
> has created any default behaviour.
> When you say "The fact that the compiler does not allow to use the inferred
> ‘Foo' type actually looks like a bug to me.”, could you give me an example
> of how you would have imagined this default behaviour to work in the case of
> Array? Would have expected Array not to have to define its typealias?

Right, I would expect Array to not need to mention Iterator at all in
its definition.

Take a look at stdlib/public/core/CollectionOfOne.swift.  It does not
define SubSequence or Indices.


(j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/

More information about the swift-evolution mailing list