[swift-evolution] [Draft] Allow multiple conformances to the same protocol

Vladimir.S svabox at gmail.com
Thu Jun 9 09:25:08 CDT 2016


I like the idea as associatedtype is playing the role of generic type and 
in extension we conforms to the protocol with some specific generic type as 
associated type.

I mean the first idea probably could be
protocol From<T> {
      init(_ value: T)
  }
but "protocols do not allow generic parameters; use associated types 
instead", so it seems natural to express concrete type as associated type 
for protocol in generic syntax <Type>

Probably alternative syntax could look like:

extension Int : From where .FromType = Float { }

Also, it seems like this proposal could help to solve a problem with the 
same name of associated type in different protocols:

protocol One {
      associatedtype Element
      func foo(t: Element)
  }

protocol Two {
      associatedtype Element
      func bar(t: Element)
  }

struct OneTwo : One, Two {
     func foo(t: Int) {}
     func bar(t: String) {}
}
// type 'OneTwo' does not conform to protocol 'Two'
// candidate has non-matching type '(t: String) -> ()' [with Element = Element]

So, as I understand, will be possible
struct OneTwo : One, Two<String> {
     func foo(t: Int) {} // OneTwo.Element will be Int
     func bar(t: String) {}
}

On 08.06.2016 22:07, Антон Жилин via swift-evolution wrote:
> ==Motivation==
>
> protocol From {
>     associatedtype FromType
>     init(_ value: FromType)
> }
>
> The problem is, one type cannot implement multiple From "conversions".
>
> ==Proposed solution==
>
> Allow specifying all associated types using generic syntax.
>
> extension Int : From<Float> { }
> extension Int : From<Double> { }
>
> This is only allowed in conformance declarations.
>
> ==Future directions==
>
> We can replace all *Convertible protocols with From and Into, which will be
> defined similarly to Rust.
>
> - Anton
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>


More information about the swift-evolution mailing list