用于 Swift 穷举开关语句的 Noop

Swift 需要详尽的 switch 语句,并且每种情况都有可执行代码。

“ switch”中的“ case”标签应该至少有一条可执行语句

有没有人想出一个好办法来处理那些你不想做任何事情的案子?我可以在里面放一个 println () ,但是感觉很脏。

22160 次浏览

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.

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

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

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"


}

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.

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.

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")
}

A clean solution I use for my default case is:

default: ()