[swift-evolution] [Review] SE-0081: Move where clause to end of declaration

Goffredo Marocchi panajev at gmail.com
Sun May 15 17:58:15 CDT 2016


Makes sense, I would not mind the mandatory conformance actually.

Sent from my iPhone

On 15 May 2016, at 23:45, Brent Royal-Gordon <brent at architechies.com> wrote:

>> Being able to let the developer decide how to place relevant type information with the freedom of being able to keep some/all/none type information local and some/none/all extra information moved to the end of the declaration.
> 
> To be clear, I do think it makes sense to move *all* `where` clauses to the end of the parameter list, not allow them both within the angle brackets and at the end of the definition. And I'm not convinced it makes sense to support moving all conformance information to the `where` clause, either. A generic parameter list like `<T, U>` is vacuous; when you're dealing with something like this:
> 
>    public func transcode
>        <Input: IteratorProtocol, InputEncoding: UnicodeCodec, OutputEncoding: UnicodeCodec>
>        (_ input: Input, from inputEncoding: InputEncoding.Type, to outputEncoding: OutputEncoding.Type, stoppingOnError stopOnError: Bool, sendingOutputTo processCodeUnit: @noescape (OutputEncoding.CodeUnit) -> Void) -> Bool
>        where InputEncoding.CodeUnit == Input.Element
> 
> The detail in the `where` clause really is of secondary importance, especially compared to how much syntax it takes to specify, while this:
> 
>    public func transcode
>        <Input, InputEncoding, OutputEncoding>(_ input: Input, from inputEncoding: InputEncoding.Type, to outputEncoding: OutputEncoding.Type, stoppingOnError stopOnError: Bool, sendingOutputTo processCodeUnit: @noescape (OutputEncoding.CodeUnit) -> Void) -> Bool
>        where Input: IteratorProtocol, InputEncoding: UnicodeCodec, OutputEncoding: UnicodeCodec, InputEncoding.CodeUnit == Input.Element
> 
> Leaves far too much unspecified until the end.
> 
> I'm actually tempted to suggest that a conformance should be *mandatory* and you should have to specify `Any` if you don't have anything more specific to say about the generic parameter:
> 
>    func map<T: Any>(@noescape transform: (Element) throws -> T) rethrows -> [T]
> 
> That would penalize the "leave everything until the end" style without actually introducing any arbitrary rules forbidding it.
> 
> -- 
> Brent Royal-Gordon
> Architechies
> 


More information about the swift-evolution mailing list