Noop for Swift's Exhaustive Switch Statements

Swift

Swift Problem Overview


Swift requires exhaustive switch statements, and that each case have executable code.

> 'case' label in a 'switch' should have at least one executable statement

Has anybody settled on a good way to handle the cases where you don't want to actually do anything? I can put a println() in there, but that feels dirty.

Swift Solutions


Solution 1 - Swift

According to the book, you need to use break there:

> The scope of each case can’t be empty. As a result, you must include at least one statement following the colon (:) of each case label. Use a single break statement if you don’t intend to execute any code in the body of a matched case.

Solution 2 - Swift

You can use a break statement:

let vegetable = "red pepper"
var vegetableComment: String = "Nothing"
switch vegetable {
case "cucumber", "watercress":
    break // does nothing
case let x where x.hasSuffix("pepper"):
    vegetableComment = "Is it a spicy \(x)?"
default:
    vegetableComment = "Everything tastes good in soup."
}

Example modified from the docs

Solution 3 - Swift

Below is one option for null statement, but maybe not a good solution. I cannot find a statement like python pass

{}() 

for switch case, break is better choice.

break

Solution 4 - Swift

In addition to break mentioned in other answers, I have also seen () used as a no-op statement:

switch 0 == 1 {
case true:
    break
case false:
    ()
}

Use () if you find break confusing or want to save 3 characters.

Solution 5 - Swift

Do nothing in exhaustive switch case statements:

Swift:

switch yourVariable {
case .someCase:
    break
}

SwiftUI:

switch yourVariable {
case .someCase:
    EmptyView() // break does not work with ViewBuilder
}

Using EmptyView() instead of break in SwiftUI views prevents the error:

> Closure containing control flow statement cannot be used with function > builder ViewBuilder.

EmptyView() is a SwiftUI standard view (tested with Xcode 12, iOS 14) and does not need to be defined yourself.

Solution 6 - Swift

The cleanest solution I've found is to simply include your last statement in the switch case as your default. This avoids the need to add break or other unnecessary statements while still covering all possible cases.

For example:

switch myVar {

case 0:
    myOtherVar = "Red"

case 1:
    myOtherVar = "Blue"

default:
    myOtherVar = "Green"

}

Solution 7 - Swift

You can check specific case, no need to be exhustive with switch cases

Say you have a enum like this,

enum Selection {
        case one
        case two
        case three
    }
var myCase = Selection.one
    

you can check like this,

    if case .one = myCase {
        print("one")
    }

Solution 8 - Swift

A clean solution I use for my default case is:

default: ()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSean McMainsView Question on Stackoverflow
Solution 1 - SwiftSergey KalinichenkoView Answer on Stackoverflow
Solution 2 - SwiftFiroView Answer on Stackoverflow
Solution 3 - SwiftlbsweekView Answer on Stackoverflow
Solution 4 - SwiftpkambView Answer on Stackoverflow
Solution 5 - SwiftsistView Answer on Stackoverflow
Solution 6 - SwiftscottyhardyView Answer on Stackoverflow
Solution 7 - SwiftYodagamaView Answer on Stackoverflow
Solution 8 - SwiftsyedfaView Answer on Stackoverflow