[swift-evolution] Change subscripts to use colons

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

I've written up a draft proposal, suggestions or improvements are welcome, especially relating to the title.

__Change subscript declarations to use a colon__


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.


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