[swift-evolution] [Pitch] Extending Swift Literals

Erica Sadun erica at ericasadun.com
Sun Jul 10 22:48:19 CDT 2016

This is purely additive and would not be eligible for Swift 3. 
gist: https://gist.github.com/erica/c92f6ab115af89d5c4b9161487df6a3c

-- E

Extending Swift Literals

Proposal: TBD
Author: Erica Sadun <http://github.com/erica>
Status: TBD
Review manager: TBD

This proposal expands Swift's language literals to include common cross-platform concepts that need not require.


A Swift literal represents a fixed value in source code. A literal can be a string, a number (for example an integer), a compound value (such as an array), or one of several predefined "playground" literals including colors, resource file paths, and resource images.

Swift literals do not have types. They are universal representations that are evaluated and their types inferred from the context in which they are used. Because their nature is typeless, the same color literal can initialize UIColor, NSColor, and SKColor instances. The type cannot be inferred from the source without the context of its destination.

let color = #colorLiteral(red: 0.8100712299, green: 0.1511939615, blue: 0.4035313427, alpha: 1)
 <https://gist.github.com/erica/c92f6ab115af89d5c4b9161487df6a3c#detailed-design>Detailed Design

Namespace redesign
Kind	Literal	Parameters
Color	`#literal.color(red:, green:, blue:, alpha:)`	floating point values
Image	`#literal.image(resourceName:)`	String with resource name
File	`#literal.file(resourceName:)`	String with resource name
Kind	Literal	Parameters
Sound	`#literal.audio(resourceName:)`	String with resource name
URL	`#literal.url(string:)`, `#literal.url(filePath:)`	String with resource location
Font	`#literal.font(face:, size:)`	string, floating point
Date	`#literal.date(timeInterval:)`	floating point offset from Unix epoch
Unicode	`#literal.unicode(name:)`	Official unicode name, e.g. `#literal.unicode(name:"DOG FACE")`
Kind	Literal	Parameters
Point	`#literal.point(x:, y:)`, `#literal.point(x:, y:, z:)`, `#literal.point(x:, y:, z:, w:)`	floating point values
Vector	`#literal.vector(dx:, dy:)`, `#literal.vector(dx:, dy:, dz:)`, `#literal.vector(dx:, dy:, dz:, dw:)`	floating point
Size	`#literal.size(width:, height:)`, `#literal.size(width:, height:, depth:)` 	floating point
Rect	`#literal.rect(x:, y:, width:, height:)`	floating point
Affine Transform	`#literal.affineTransform(a:,b:,c:,d:,tx:,ty:)`, `#literal.affineTransform(translateX:, translateY:)`, `#literal.affineTransform(scaleY:, scaleY:)`, `#literal.affineTransform(rotation:)`, 	floating point
Bezier Path	`#literal.bezier("M92.21,24.29H75L73,17a8.32,8.32, 0,0,0-8.27-6.74H34.55A7.69,7.69,0,0,0,27,16.6l-2.08 4z")`	String with SVG path notation
 <https://gist.github.com/erica/c92f6ab115af89d5c4b9161487df6a3c#not-included>Not included:

Attributed Strings: I would like to see a way to define attributed strings (using some system like CSS/HTML) but could not think up a simple representation similar to the others mentioned in the preceding table.

JSON Literals: Again, probably too complex and possibly not worth their weight. If they could exist, they'd have to be imported via a resource or URL and transformed to a local type.

 <https://gist.github.com/erica/c92f6ab115af89d5c4b9161487df6a3c#impact-on-existing-code>Impact on Existing Code

This proposal is purely additive.

 <https://gist.github.com/erica/c92f6ab115af89d5c4b9161487df6a3c#alternatives-considered>Alternatives Considered

Using distinct literal names without subsuming them into a namespaced umbrella.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160710/ccbff2de/attachment.html>

More information about the swift-evolution mailing list