At WWDC 2014 Apple introduced a new official programming language called Swift to replace the aged Objective-C. In this article we'll explore some of the similiarities and differences between Swift and RubyMotion.
RubyMotion vs Swift
First off, RubyMotion itself is a toolkit and chain to build iOS applications written in Ruby that is bridged with Objective-C. Entire applications or just static libraries can be created. Swift is just a new language supported natively by Apple and it's build tools.
Swift Impressions
I've looked through much of Apple's documentation on the newly announced language and have found several concepts that I welcome as changes to writing iOS or Mac applications over Objective-C, as well as some things that Ruby provides that I hope make it over to Swift in the future.
Welcome Changes
- Ditches the bracket and semicolon syntax
- Ditches pointers
- Typing is improved and easier to use
- Simpler object initialization and method calling syntax
- Bridging for new
Stringclasses or evenSelectorinstances is simple and intuitive - Extensions allow easily adding behavior to existing classes without subclassing
- Closure/block syntax is improved
- No need for
NSStringvsNSMutableStringanymore. Declare your string as a variable usingvaror a constant usingletand that determines mutability Stringequality is finally achievable just via==operator- Typed arrays declared as
String[] - Switch statements break on the first match without the specific need for a
breakcall - Ranges!
Missing or Annoyances in Swift
- Parenthesis are not optional for calling methods - would much rather write
view.updatevsview.update()especially varandletseem archaic and odd to me. Would have much rather used Ruby's way here- Would have loved to see a
method_missingimplementation from Ruby for extra dynamicism - Do not like the
println("my \(variable)")string interpolation syntax at all - just not a fan of using the backslash - Not a fan of intializing dictionary literals with brackets, ie:
var dict:Dictionary<String, String> = ["key": "value"]seems out of place to me. Would have rather seen:var dict:Dictionary<String, String> = { "key": "value" } funcdoesn't sit just right with me. I'm not sure what I would want in place, it just catches me off guard - not a big deal obviously.
Remaining Questions
There are a few things I haven't yet figured out and would love to know if you have the answers to.
- Is there any callback such as the
Module.includedmethod, when importing a namespace? - Is something similar to
define_methodfrom Ruby available? - Do you have to include a superclass when defining a class with protocols? Meaning is the following valid?
class MyClass: NSCopyingProtocol - Have I missed a way to implement
method_missing? Guessing no since Swift uses the same runtime as Objective-C
RubyMotion
RubyMotion still has several perks, however one can definitely argue that the list was much longer before WWDC this year.
- Any IDE of your choice
- Extensive collection of Ruby gems from the community
- More people know Ruby compared to Swift
- I think Ruby will still be a more natural choice for defining intuitive and gorgeous DSLs
- Support for iOS, Mac and Android (coming in version RM 3.0) with one language