[swift-users] Optionals in switch statements

Matteo matteo at mimecastercentral.com
Wed Jun 29 05:42:31 CDT 2016


I’m trying to make the best use of swift’s switch statement while converting some old code from obj-c.

Imagine a method that takes two optional strings representing file names:

func updateFileFrom(from : String?, to: String?)

If both strings are nil, then it does nothing.
If both are non nil AND are equal it also does nothing
If both are non-nil and not equal it renames the file
If from is not nil, but to is nil, it deletes the file.
If from is nil, but to is not-nil it creates a file.

Here is my original implementation as a straight conversion using only if:

func ifs_updateFileFrom(from : String?, to: String?)
{
    if from == nil && to == nil {
        print("Nothing to do, both are nil")
    } else if from != nil && to != nil {
        if from == to {
            print("Nothing to do, both are non-nil and equal")
        } else {
            print("Renaming \(from!) to \(to!)")
        }
    } else if to == nil {
        print("Deleting \(from!)")
    } else {
        print("Creating \(to!)")
    }
}

So I’ve had a go at using a switch statement to make it more readable:

func switch_updateFileFrom(from : String?, to: String?)
{
    switch (from, to) {
    case (.None, .None):
        print("Nothing to do, both are nil")
    case (.Some, .Some) where from == to:
        print("Nothing to do, both are non-nil and equal")
    case (.Some, .Some):
        print("Renaming \(from!) to \(to!)")
    case (.Some, .None):
        print("Deleting \(from!)")
    case (.None, .Some):
        print("Creating \(to!)")
    }
}

It seems reasonable to me and clearer, but I don’t really like accessing the from and to variables within it, it just doesn’t feel right compared to ‘normal’ switch statement

i.e consider this example from the swift book:

let anotherPoint = (2, 0)

switch anotherPoint {
case (let x, 0):
    print("on x-axis with x value of \(x)")
case (0, let y):
    print("on y-axis with y value of \(y)")
case let (x, y):
    print("Somewhere else at (\(x), \(y))")
}

The switch statement is entirely self-referential with regard to the internally bound values of x and y, it has no need to access anotherPoint directly.

Is there a way to write my switch-based method that does not access from and to directly, but is also as clear?

Thanks





More information about the swift-users mailing list