I think I might found a solution that will satisfy generic protocols and not 
break the system.

The generics manifesto shows two features that are requested from generic 
protocols.

The first feature is needed to reuse the same protocol multiple types like 
struct A : Proto<B>, Proto<C>.

With SE–0142 we can actually achieve this behavior by creating new protocols 
and set a subset of the associated types from its parent super protocol.

Now we can use this trick to solve the problem from above and create two new 
protocols and use them as we previously wanted struct A : ProtoB, ProtoC. While 
this is great and solves my issue I’d like to pitch a shortcut for this.

Protocols with associated types are kinda generic, but they still need SE–0142 
to specify all the associated types.

How about making all protocols that contain associated types to also have a 
shortcut generic protocol that specifies all the associated type in its generic 
parameter list?

Some first bikeshedding:

protocol MyStringCollection : Collecntion where Iterator.Element == String, 
Index == Int {}

protocol Collection<ElementType, IndexType> : Collection {
     
    typealias Iterator.Element = ElementType
    typealias Index = IndexType
}
But instead of creating these types by yourself, the compiler would 
autogenerate these for any protocol that have a list of associated types. To 
prevent collision between protocol names like Collection vs. 
Collection<ParamList> one could automatically prefix the generated procols with 
Generic.

Collection will generate GenericCollection<Element, Index>

This would be a huge shortcut for the feature introduced in SE–0142.

What does the community think about this idea?



-- 
Adrian Zubarev
Sent with Airmail

Am 2. Dezember 2016 um 20:13:50, Charles Srstka ([email protected]) 
schrieb:

On Dec 2, 2016, at 12:34 PM, Adrian Zubarev via swift-evolution 
<[email protected]> wrote:

I just overlooked that the subsection about generic protocols was inside the 
Unlikely section.

The problem is that I need a way to refer to a function with a specific name. 
Plus the connection type has to have a specific API, like having a 
DispatchQueue and know the router object if there is any (sounds like a 
protocol right?!). The function reference should also keep the connection 
object alive with a strong reference. 

associatedtype does not solve that problem for me.

I clearly see that generic protocols overlap with associatedtype but couldn’t 
we find a compromise here? For instance like Chris Lattner introduced generic 
type aliases without the ability of constants.

Why don’t we just use angle brackets to specify associated types? Protocols 
aren’t using them for anything anyway. Then you could:

if let someSequence as? Sequence<Iterator.Element == Int> { // do something }

which would form a nice parallel to the syntax for casting things to generic 
types.

Charles

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to