[swift-evolution] [Pitch] Remove associated type inference

David Hart david at hartbit.com
Wed May 25 16:43:07 CDT 2016

Here’s a pitch for removing associated type inference as per the Generics Manifesto. If we want to do it, we’d better do it before Swift 3:

Remove associated type inference

Proposal: SE-XXXX <https://github.com/apple/swift-evolution/blob/master/proposals/XXXX-remove-associated-type-inference.md>
Author: David Hart <https://github.com/hartbit>, Douglas Gregor <https://github.com/DougGregor>
Status: TBD
Review manager: TBD

This proposal seeks to remove the inference of associated types in types conforming to protocols.


Even if associated types inference in a useful feature, it is also a big source of bugs in the compiler. This proposal argues that the usefulness does not outweight its architectural complexity. As per the Generics Manifesto <https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md>:

associated type inference is the only place in Swift where we have a global type inference problem: it has historically been a major source of bugs, and implementing it fully and correctly requires a drastically different architecture to the type checker.
Because this is a breaking change, it would be beneficial to implement it for Swift 3. 

 <https://github.com/hartbit/swift-evolution/blob/remove-associated-type-inference/proposals/XXXX-remove-associated-type-inference.md#detailed-design>Detailed Design

The proposal would remove associated type inference and make code which relied on it invalid:

protocol IteratorProtocol {
  associatedtype Element
  mutating func next() -> Element?

struct IntIterator : IteratorProtocol {
  mutating func next() -> Int? { ... }  // used to infer Element = Int
The compiler would generate an error message stating: error: IntIterator is missing its Element associated type declaration. The code would have to be modified as follows to fix the error:

struct IntIterator : IteratorProtocol {
    typealias Element = Int
    mutating func next() -> Int? { return nil }  // used to infer Element = Int
 <https://github.com/hartbit/swift-evolution/blob/remove-associated-type-inference/proposals/XXXX-remove-associated-type-inference.md#impact-on-existing-code>Impact on Existing Code

This is a breaking change that will require conforming types which relied on the inference, including in the Standard Library, to explicitly declare associated types. A Fix-It could be introduced to add the typealias and leave the type to be filled in. That way, all the type inference could be removed from the compiler.

 <https://github.com/hartbit/swift-evolution/blob/remove-associated-type-inference/proposals/XXXX-remove-associated-type-inference.md#alternatives-considered>Alternatives Considered

The only alternative is to keep the inference with the known consequences on the compiler.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160525/0a81a29c/attachment.html>

More information about the swift-evolution mailing list