Swift 2: Pattern Matching with “if case”

While looking through slides for What’s New in Swift again, I’ve decided to instead play around with and write down the new Swift 2 idioms here for easy reference for myself (and hopefully others). I’m going to start with Pattern Matching with if case.

The Setup

Let’s say you’re making a Sign In Form in your app. You’ll have the following fields:

enum SignUpFormField {
    case FirstName(String)
    case LastName(String)
    case EmailAddress(String)
    case DOB(NSDate)

And of course, as the user enters his or her Date of Birth, you want to show them that they were born before Taylor Swift if that is actually the case. Taylor Swift’s birthday is just a constant in your app:

let taylorSwiftsBday: NSDate = {
    let gregorianCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
    let dateComponents = NSDateComponents()
    dateComponents.day = 13
    dateComponents.month = 12
    dateComponents.year = 1989
    return gregorianCalendar?.dateFromComponents(dateComponents) ?? NSDate()

BS2 (Before Swift 2)

So now, it’s time to write the function to compare the user’s birthday to Taylor Swift’s birthday. BS2, you might have done it as follows:

func bornBeforeTaylorSwift(signUpFormField: SignUpFormField) {

    switch signUpFormField {
    case .DOB(let otherBday)
        where taylorSwiftsBday.compare(otherBday) == .OrderedDescending:
        print("Fun fact: You were born before Taylor Swift!")

Notice the need for a full on switch statement / syntax, and the default case used to do nothing.

Swift 2

These issues mentioned above been solved in Swift 2 with a much simpler pattern matching “if case”:

func bornBeforeTaylorSwift(signUpFormField: SignUpFormField) {

    if case .DOB(let otherBday) = signUpFormField
        where taylorSwiftsBday.compare(otherBday) == .OrderedDescending
        print("Fun fact: You were born before Taylor Swift!")

Advanced Pattern Matching

Note that you can use the usual advanced pattern matching techniques in the “if case” statement that you’ve probably used in switch statements:

let numberOfTaylorSwiftSongsFavorited = 93

if case 0...225 = numberOfTaylorSwiftSongsFavorited {
    print("this is a valid number of favorited Taylor Swift Songs")

I personally still have to get my brain to think of this way of writing my code naturally, but I’m sure it’ll come with practice and lots of refactoring!

Enjoy the article? Join over 20,000+ Swift developers and enthusiasts who get my weekly updates.

  • Maxime Capelle


    I don’t understand in the “Comparing optionals” example how do you compare theGivenAnswer and theGuessedAnswer.

    The if statement seems to be only related to theGuessedAnswer. So it looks like an if let statement.

    Did I miss something?

    • I think I confused myself! lol Removing that section for now and will investigate more to see if I can get it to do what I was thinking.

      • Maxime Capelle

        Maybe you wanted to compare a String to a String? like this :

        let theGivenAnswer: String = “Taylor Swift”
        let theGuessedAnswer: String? = “Taylor Swift”

        if case let theAnswer? = theGuessedAnswer where theAnswer == theGivenAnswer {
        print(“The answer (theAnswer) is a match!”)

  • Steve Riggins

    Using case outside of “normal” enumerations syntax breaks my mind

    • Yes… that’s why I had to work through these examples and write them down. Still going to take a while before it feels like the “natural” thing to do!

  • Pingback: Swift 2: “for… in” filtering()

  • Am I wrong or if case doesn’t necessarily work like switch ?

    // This doesn't work
    if case 1, 3, 5 = component {

    Although that’s a valid case for a switch ¯_(ツ)_/¯

  • I’m about to perform 2 nested switch with 2 optionals. With if case let multiple statement, I can select just the case I want ^^

  • Yariv

    What about multiple cases in one if statement like “case .FirstName, LastName:” ?
    Couldn’t get the if statement to pass :~/

  • Never Mind

    But does it work in a conditional expression: ‘ ? : ‘. Answer: No.

  • Jon Bott

    Thanks for this article!🎓 I have literally visited it at least 10 times in the past year! I can never remember the syntax.

  • Spencer Müller Diniz

    How does autocomplete handle these situations?

    if case .DOB(let otherBday) = signUpFormField

    Doesn’t seem like autocomplete will know what to do.

    One of the reasons I don’t like Swift syntax is that it’s not very intuitive.
    There’s no consistency across the language…

  • You might prefer to just use the pattern match operator instead of if case, is more elegant and intuitive: if 0…225 ~= numberOfTaylorSwiftSongsFavorited{
    print(“also works”)