> Am 27.05.2016 um 20:47 schrieb Matthew Johnson via swift-evolution 
> <swift-evolution@swift.org>:
> 
> 
>> On May 27, 2016, at 12:05 PM, Charles Srstka via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> On May 27, 2016, at 9:31 AM, plx via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>> For the Sequence/Collection it’s a lot of work for IMHO a rather minor 
>>> convenience, but for more-complex type associated-type relationships it 
>>> could start to pay its own way.
>> 
>> Is it really that minor, though? For something so commonly encountered as 
>> methods that take sequences/collections, this:
>> 
>> func doSomething(foos: [Foo], bars: [Bar], bazzes: [Baz])
>> 
>> is not only a whole lot easier to type, but is worlds clearer to read than:
>> 
>> func doSomething<S: SequenceType, T: SequenceType, U: SequenceType where 
>> S.Generator.Element == Foo, T.Generator.Element == Bar, U.Generator.Element 
>> == Baz>(foos: S, bars: T, bazzes: U)
>> 
>> Not only is the latter line intimidating to look at as is, but it separates 
>> the contained type from the parameters themselves. Given how unwieldy this 
>> second form is, it seems almost certain that the former line will be used 
>> more frequently in the real world.
> 
> When generalized existentials are introduced (Austin Zheng has a proposal for 
> this) you will be able to do this (assuming we switch to the `&` syntax:
> 
> typealias SequenceOf<T> = Sequence where .Element == T
> 
> func doSomething(foos: SequenceOf<Foo>, bars: SequenceOf<Bar>, bazzes: 
> SequenceOf<Baz>)

That’s a really nice solution, which gets even nicer with plx suggestion of 
putting the typealias within the protocol like this: 

protocol Sequence {
    typealias of<E> = S: Self where .Element == E
}

-Thorsten



> 
> It’s still slightly more verbose than the array shorthand, but it’s a far cry 
> from what you have to do with generics today.
> 
> If you wanted it to be generic you could write it as:
> 
> func doSomething<S: SequenceOf<Foo>, T: SequenceOf<Bar>, 
> SequenceOf<Baz>(foos: S, bars: T, bazzes: U)
> 
>> 
>> Charles
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to