[swift-evolution] Change subscripts to use colons

James Froggatt james.froggatt at me.com
Mon Jul 11 15:22:01 CDT 2016


I've added one of my original points to the motivation section:

‘[The arrow] implies that subscripts have the full capabilities of functions, such as the ability to throw. If throwing functionality were to be added to accessors, it is likely the specific get/set accessor would be annotated. In this case, the effects on a subscript's ‘function signature’ could become a source of confusion.’


Also, removed the second ‘mental stumbling block’ line.


> On 11 Jul 2016, at 21:01, James Froggatt <james.froggatt at me.com> wrote:
> 
> 
> I've written up a draft proposal, suggestions or improvements are welcome, especially relating to the title.
> 
> 
> 
> __Change subscript declarations to use a colon__
> 
> --Introduction--
> 
> Currently, subscript declarations follow the following model:
> 
> subscript(externalName internalName: ParamType) -> ElementType {
>    get { … }
>    set { … }
> }
> 
> The initial keyword ‘subscript’ is followed by a parameter list, followed by an arrow to the accessed type.
> 
> 
> --Motivation--
> 
> The arrow, borrowed from function syntax, is very much out of place in this context, and so can act as a mental stumbling block.
> 
> Subscripts act like parameterised property accessors. This means, like a property, they can appear on the left hand side of an assignment, and values accessed through subscripts can be mutated in-place. The colon has precedent in declaring this kind of construct, so it makes sense to reuse it here.
> 
> --Proposed solution--
> 
> A simple replacement of ‘->’ with ‘:’ in the declaration syntax.
> 
> --Detailed design--
> 
> This would change the above example to look like the following:
> 
> subscript(externalName internalName: ParamType) : ElementType {
>    get { … }
>    set { … }
> }
> 
> 
> --Impact on existing code--
> 
> Existing code would have to update subscripts to use a colon. This can be automated in a conversion to Swift 3 syntax.
> 
> 
> --Potential hazards--
> 
> Use of colons could have a negative effect on readability. This largely depends on coding style, which can match either of the following:
> 
> subscript(_ example: Type) : ElementType
> 
> subscript(_ example: Type): ElementType
> 
> This issue is most apparent in the latter example, which omits the leading space before the colon, as the colon blends into the closing bracket.
> 
> However, the real-world effect of this change is hard to predict, and subscript declarations are rare enough that the consequences of this change are very limited. In addition, the current ‘->‘ syntax can already act as a mental stumbling block.
> 
> --Alternatives Considered--
> 
> We could leave the syntax as it is, or use an alternative symbol, such as ‘:->’ or ‘<->’.
> 
> We could also leave open the possibility of expanding function syntax with ‘inout ->’.



More information about the swift-evolution mailing list