Default Arguments in Swift Functions

Default Parameters in Swift

Its the little things that make my life as programmer easier. Like default parameters in Swift. From the The Swift Programming Language (Swift 2.1):

You can define a default value for any parameter in a function by assigning a value to the parameter after that parameter’s type. If a default value is defined, you can omit that parameter when calling the function.

I was working on a swifty implementation of the DigitalOcean API and I came up with a monster function definition, like this:

func createDropletNamed(name: String,
    region: String = "nyc3",
    size:String = "512mb",
    image:String = "ubuntu-14-04-x64",
    keys:[String] = [],
    backups:Bool = false,
    ipv6:Bool = true,
    userData:String = "",
    privateNetworking:Bool = false,
    callback:(NSDictionary?, ErrorType?) -> Void = {_,_ in }) {

In the days of Objecective-C, if I wanted simpler convenience versions of this call, I’d define additional functions which take fewer arguments,[1] and then call the monser function by suppliying some defaults. You see that pattern all the time in Objective-C initializers.

Thanks to the magic of default parameters, that’s not nececcary. Any of the following calls are valid based on the original definition with default arguments:

createDroplenNamed("devserver1")

createDropletNamed("devserver2", size: "1gb")

createDropletNamed("devserver3") { result, error in
    //handle callback
}

The swift manual advises lising arameters with default arguments after paramters that always require arguments. Elsewhere, it recommneds that closures always come in the last position to support the trailing closure syntax. Those two rules together imply that if you have a funciton with default arguments and a closure, the closure must take a default argument. Luckily it’s pretty easy to define an empty closure like {_,_ in }.


  1. Actually, I’d probably define a function that takes an NSDictionary, but then I’d lose auto-completion and type checking.  ↩

Goals for this Site

My goals this blog are to develop a habbit of publishing writing and photographs. The key thing to both these activities is to practice regularly and to publish. This is my place to do that.

I used to have a job writing for a living. I was pretty good at it, and I was generally productive. I also enjoyed it. Now my job is coding, not writing. I always intended to keep writing stuff, but that hasn’t happened. This is an effort to publish a few times a week. I’m sure that in the beginning meeting that goal will mean publishing some mediocre to poor articles. For now, publishing a poor article is a minor improvement over publishing nothing.

Photography is similar to writing in that I always think I’m going to do a lot more than I actually do. My goal for photography to post a few pictures every week or two. These will be new pictures I’ve taken in the previous week, not a dive into my archive. This might include poor photographs taken in my back yard. Again, I consider this a minor improvement over publishing nothing.

For now at least, the goals are personal. I don’t have any goals of readership or income. I doubt I’ll every change that for this particular blog.

Version 0.1

In the world of semantic versioning, version 1.0.0 is the point where you’ve made a public commitment to a stable API. If links are the public API of a web site, this site is pre–1.0. Links may change and break as I put things together. But I wanted a place to post things, so I’m forging ahead.