The Best Design Decision Apple Made in Swift
Apple announced the Swift programming language during this morning’s WWDC. It was lots of fun to read through the five hundred page documentation on iBooks. I am very impressed with how elegantly Apple incorporated functional programming concepts and am very excited about what mainstream adoption of Swift will mean for functional programming.
There is a lot to like about Swift, but my favorite is that only variables explicitly marked as nillable can be assigned a null value. Normal variables cannot be null and accesses to nillable variables have to explicitly unwrap the nil value with a ! or chained with ?.
“nil cannot be used with non-optional constants and variables. If a constant or variable in your code needs to be able to cope with the absence of a value under certain conditions, always declare it as an optional value of the appropriate type.”
Swift will be the first mainstream language to adopt this requirement and I hope that other languages will follow its lead. Null pointer exceptions have been a huge pain point of any statically typed or dynamically typed language. Tony Hoare, the inventor of null, considers his own invention a “billion dollar mistake”.
In Swift a nil is value like any other, backed by a real memory location. This effectively eliminates the traditional null pointer exception. The compiler forces the developer to use an if statement to handle both the nil and non-nil cases when access the nillable variable. Scala and Haskell take a similar approach with the Option/Maybe monad.
“Swift’s nil is not the same as nil in Objective-C. In Objective-C, nil is a pointer to a non-existent object. In Swift, nil is not a pointer—it is the absence of a value of a certain type. Optionals of any type can be set to nil, not just object types.” - The Swift Programming Language.
This distinction is important since nil is no longer a special case within the language as an absence of a value, it is simply another value.
Kudos to Swift team for making this bold decision.