[swift-evolution] [Pitch] Moving where Clauses Out Of Parameter Lists

Pyry Jahkola pyry.jahkola at iki.fi
Wed Apr 6 13:57:53 CDT 2016


> This almost seems like it could work so that it didn't even need the bracketed parts to be able to figure out the types:
> 
> func anyCommonElements(lhs: T, _ rhs: U) -> Bool where
>    T : SequenceType,
>    U : SequenceType,
>    T.Generator.Element: Equatable,
>    T.Generator.Element == U.Generator.Element
> {}

I'd still keep the generic arguments listed there in the brackets if only for the following reasons:

1. The new names get introduced (in `<...>`) before their first use. So if you happened to name one of them `String`, it would be clear that you didn't mean `Swift.String`.

2. It's been sometimes wished that you could explicitly specify which specialisation you want to use, e.g. when passing a function into a handler (e.g. `let operation = anyCommonElements<[Int], [Int]>(_:_:)`).

3. How would you otherwise mention a generic type if there were no constraints for it? I think the suggested form:

extension Array<T> {
    // no constraints needed (not for T above, not for U below)
    func map<U>(transform: T -> U) -> Array<U> { ... }
}

reads better than this:

extension Array<T> {
    // Wait what, where did U come from?
    func map(transform: T -> U) -> Array<U> { ... }
}

— Pyry
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160406/da6e0917/attachment.html>


More information about the swift-evolution mailing list