Swift Extensions

David
Littlelines logo

Swift Logo

This past Monday, Apple made a shocking announcement. They are moving forward without Objective-C. After the murmuring lessened, Apple went on to demonstrate an attractive, clean and expressive new language called Swift. Once the Taylor Swift jokes had subsided, the developer community seemed genuinely excited about this new look for iOS development. More information about the new language can be found on Apple’s site.

Over the past year I had begun digging into iOS development and learning Objective-C. While the thrill of seeing something you built on your iPhone was enticing, every time I started playing with it again, I was reminded how little enjoyment I got out of writing Objective-C. As someone not intimately familiar with the language, Objective-C proved hard to digest, write and understand each time I hopped back into Xcode. Sadly, without any other option for iOS apps, your only option was to keep trudging on. Monday changed that.

During the announcement on Monday, my eyes lit up with the prospect of a clean and easy-to-grasp language to ship applications on iOS and OSX. With that, I dove into the WWDC Videos and full length book available for free on iBooks to learn as much as I could about this new and attractive language. Coming from Ruby, I loved what I saw: optional parenthesis, no semicolons and concise, expressive code. To give you a sense of the improvement I saw my first steps into Swift, here is a basic “Hello, World!” app written in both Objective-C and Swift:

Objective-C

  #import <Foundation/Foundation.h>

  int main(void)
  {
      NSLog(@"Hello, world!\n");
  }

Swift

  import Foundation

  println "Hello, World!"

Like the first time I experienced Perl after being a Java developer years ago, I was hooked.

One of the first powerful features in Swift I started to enjoy playing with were Extensions. Extensions, similar to monkey patching, allow you to add new functionality to existing structures such as classes, structs, or enumerations. As a rubyist, my first experiments have been focused on bringing some of the joy I get from using ActiveSupport helpers to my iOS development space. An example of a basic extension to add the ability to uppercase a string with uppercase instead of the more verbose uppercaseString is as follows:

  extension String {
    var uppercase: String { return self.uppercaseString }
  }

This makes the following valid Swift syntax and instantly adds this method to Xcode’s autocomplete and syntax highlighting.

  var name = "David"
  name.uppercase # "DAVID"

To try my hand at a somewhat more technical extension I decided to add the helper method times to the Int class in Swift. To do this, I needed to define a function times that accepted a function as a parameter and executed it as many times as defined by the initial Int value.

  extension Int {
    func times(task: () -> ()) {
        for _ in 0..self {
            task()
        }
    }
  }

Using this extension my Swift code begins to look very familiar…

  5.times {
    println "Hello, World!"
  }

  # Hello, World!
  # Hello, World!
  # Hello, World!
  # Hello, World!
  # Hello, World!

Finally, before admitting defeat and going to sleep, I added a few helpers onto the Array class to bring some rubyisms to Swift.

  extension Array {
    var first: T { return self[0] }
    var second: T { return self[1] }
    var forty_two: T { return self[42] }
    var last: T { var last = self.count - 1; return self[last] }
  }
  var things = [1, 2, 3, 4, 5]
  things.first # 1
  things.second # 2
  things.last # 3
  things.forty_two # Answer to The Ultimate Question of Life, the Universe, and Everything

Cheers!