It’s a little be late to bring this out, but I have some new thoughts on it ~
First of all, this proposal basic concept is for easier and clearly to write 
Protocol extension.
So this means the “PointCollection" still a protocol, So why not use protocol 
inheritance to define it. 
What about we just write it like this:

public protocol PointCollection:CollectionType where T.Generator.Element == 
CGPoint {}

extension PointCollection {
    
    // extension methods
}

and for multiple protocol conformation we can still use typealias, which 
currently supported, etc: 

typealias CombinedProtocol = protocol<ProtocolA, ProtocolB, ProtocolC>



> 在 2015年12月7日,上午3:27,Matthew Johnson via swift-evolution 
> <[email protected]> 写道:
> 
> Yes, the idea is that this protocol type with partially or totally bound 
> associated types would be valid anywhere you could use a type.
> 
> I’m not a compiler developer and I’m sure there are implementation 
> complexities and a lot of subtleties to work through.  But I believe it is 
> possible as Swift’s protocols share many similarities with ML’s module system 
> and ML is able to do this.  
> 
> Hopefully someone from the core team can chime in on feasibility, 
> desirability, and priority of a feature like this.
> 
> 
>> On Dec 6, 2015, at 1:22 PM, Paul Cantrell <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>>> The general form of this would look like:
>>> 
>>> protocol<P1, P2, P3 where *list of constraints*>
>> 
>> 
>> I’m very interested in this. Would this also extend to variables & 
>> parameters with generic types that are only constrained, or not specified at 
>> all? For example:
>> 
>>     let heterogeneousCollections: protocol<CollectionType where 
>> Generator.Element: CollectionType> = whatever
>> 
>> …or even:
>> 
>>     let heterogeneousCollections: [CollectionType] = whatever
>> 
>> …because we don’t need to know the element types to get the max count:
>> 
>>     let maxSize = heterogenousCollections.map { $0.count }.maxElement()
>> 
>> If so, I’m desperate for this. The lack of it forced some ugly compromises 
>> in Siesta’s API.
>> 
>> Cheers, P
>> 
>> 
>>> On Dec 6, 2015, at 9:07 AM, Matthew Johnson via swift-evolution 
>>> <[email protected] <mailto:[email protected]>> wrote:
>>> 
>>> This request isn’t really about typealias at all.  It has two elements.
>>> 
>>> First, it’s about the ability to bind Self and / or associated types in a 
>>> protocol and use the result as a type.  This is highly desirable and is 
>>> similar to features in the ML module system.
>>> 
>>> First is the ability to use a protocol with self or associated types as a 
>>> type, not just a generic constraint:
>>> 
>>> protocol<CollectionType where CollectionType.Generator.Element == CGPoint>
>>> 
>>> I don’t think the `T:` label is necessary here as the protocol name serves 
>>> as a good identifier in this context.  Although the protocol name could 
>>> probably be omitted when there is only one protocol here as it is implicit:
>>> 
>>> protocol<CollectionType where Generator.Element == CGPoint>
>>> 
>>> The general form of this would look like:
>>> 
>>> protocol<P1, P2, P3 where *list of constraints*>
>>> 
>>> In this case the protocol name would be required, at least when more than 
>>> one protocol in the list have an associated type with the same name (and 
>>> possibly in all cases).  The list of constraints could identify associated 
>>> types, bind them to concrete types, constrain Self to a specific 
>>> superclass, etc.  The Self constraint might look like this:
>>> 
>>> protocol<P1, P2, P3 where Self: UIViewController>
>>> 
>>> Ideally we would not need to bind all associated types in the protocol in 
>>> order to use it at a type, but would only be allowed to use members that do 
>>> not mention the unbound associated type in their signature.
>>> 
>>> Once we have the ability to bind associated types and use the result as a 
>>> type, the typealias use falls out automatically.
>>> 
>>> Second, it’s about the ability to extend a typealias where some generic 
>>> constraints are specified in the typealias.  This would allow us to re-use 
>>> the binding of generic constraints, but could be confusing if the extension 
>>> is far removed in source from the typealias.  I’m not sure how I feel about 
>>> this part of the proposal.
>>> 
>>> Matthew
>>> 
>>>> On Dec 6, 2015, at 4:28 AM, Adrian Kashivskyy via swift-evolution 
>>>> <[email protected] <mailto:[email protected]>> wrote:
>>>> 
>>>> I believe this could be achieved using generic typealiases, proposed here: 
>>>> https://lists.swift.org/pipermail/swift-evolution/2015-December/000132.html
>>>>  
>>>> <https://lists.swift.org/pipermail/swift-evolution/2015-December/000132.html>
>>>> 
>>>> Pozdrawiam – Regards,
>>>> Adrian Kashivskyy
>>>> 
>>>>> Wiadomość napisana przez QQ Mail via swift-evolution 
>>>>> <[email protected] <mailto:[email protected]>> w dniu 
>>>>> 06.12.2015, o godz. 08:17:
>>>>> 
>>>>> If typealias support protocol constraint, I think we can reuse a lot of 
>>>>> code, also more readable
>>>>> 
>>>>> For Example: 
>>>>> 
>>>>> typealias PointCollection = protocol<T:CollectionType where 
>>>>> T.Generator.Element == CGPoint>
>>>>> 
>>>>> public extension PointCollection {
>>>>>     
>>>>>     
>>>>>     
>>>>> }
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> [email protected] <mailto:[email protected]>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> 
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> [email protected] <mailto:[email protected]>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> 
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
> 
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution

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

Reply via email to