Apple’s announcement of the Swift language was quite a surprise, while the company had extended Objective-C in the past, it had not dabble in programming languages since Dylan and Applescript, so I was quite curious to see what this is about.
Swift is presented as the successor of Objective-C, but drops the C compatibility while keeping a C-like syntax, in a way similar to Go or Rust, Swift borrows ideas from many existing languages: Objective-C, Python, but also Rust and C♯. Compared to say Python, the language is actually pretty complex, as it has many features. Gone are the days were languages tried to be minimalistic, here the goal is clearly to implement features for common programming patterns.
Given the fact these day I mostly code in C++11 and Python 2.7, I found the language to have interesting features:
- Compiled language, with the goal of being faster than Objective-C. Uses LLVM as compilation back-end.
- References and Value types. Swift borrows from C♯ that classes are reference types and structs are value types, passed by copy to functions and methods. This means that complex data can live on the stack and be contiguous in collections. This makes a big performance difference and is also a big theme in C++11 and C++14.
- Strong typing with type inference, with a differentiation between variable and constant, one declared with
var, the other with
let, no duck typing for functions, but the language supports templates and protocols (interfaces). Types can be extended outside of the original declaration and this can be used to make them adopt new protocols.
- Enum types can be based on any raw type (not only integers), and can have associated data depending on the enum value, so they also implement the functionality of union.
- Switch statement based on any types, with the complex matching rules, so you can branch on ranges, or conditional expressions. Something that the Rust language has.
- Optional types everywhere. Swift has no pointers, and no magic
None/Nilvalue like Python has, Conditional types express the idea of something of type X or nothing, a feature you would implement using a pointer and check for
null, this is the same as the
boost:optionaltemplate in C++, but more integrated into the language, as there is an optional access operator.
Consider an object A which has a field
bwhich can contain a value of type B which has a field
c, which can contain a value of type C. If you have an value
aof type A and you just want to read the field
a.b.c, you have to add a lot of if statements, or try accessing it and handle exceptions. In Swift you just call
a?b?cwhich returns you can optional of type C. This is really nice because this kind of access is pretty common (for instance in protocol buffers).
- Lot of syntactic sugar: nice loops, tuple decomposition, i.e
let (x, y) = getCoordinates(), clean range expression
[1..9], integers can contain underscore to be more legible like
1_000_000, string interpolation can contain arbitrary expressions (including function calls)
"sin \(x) = \(sin(x))"
We will see how the language performs in practice, I suspect its impact will mostly be determined by the way Apple releases the language, if it is free, it might get wider adoption. Regardless of the success of Swift, I think many of the ideas in the language are good ones, and so I hope this will lend support to the languages which already have those features, and encourage other languages to adopt them.