簡體   English   中英

Swift:切換聲明的通過行為

[英]Swift: Switch statement fallthrough behavior

目前我有這個:

let somePoint = (1, 0)

switch somePoint {
case (0,0):
    print("origin") // does not print
    fallthrough
case (_, 0):
    print("y-axis") // prints y-axis. this makes sense
    fallthrough
case(0, _):
    print("x-axis") // prints x-axis (because of fallthrough? this should not print)
    fallthrough
case(-2...2, -2...2):
    print("in 5x5 box about the origin") // this prints and makes sense
default:
    print("somewhere else") // does not print
}

我的這個switch語句的目標是讓每個case打印如果它是真的而不是只有第一個匹配print的case。 我以為我可以通過這個演繹聲明來做到這一點。 但是,這讓我懷疑它是如何工作的。 即使案例不匹配,為什么fallthrough會自動打印下一個案例? 我怎么能按照我想要的方式使這個switch語句工作?

Fallthrough下一個案例,而不是下一個匹配案例。 該概念繼承自C switch語句,其中每個case可以被認為是goto目標標簽, switch語句將執行帶到第一個匹配的語句。

在C中, switch語句僅指示塊內執行的開始位置 為了方便起見,你可以使用break語句跳過switch體的其余部分,但沒有任何東西會強迫你; 如果不這樣做,執行會繼續正常進行,就像case不存在一樣。 例如:

switch (countdown)
{
    case 3: puts("3...");
    case 2: puts("2...");
    case 1: puts("1...");
    case 0: puts("0!");
}

在沒有任何break ,如果countdown是3,那么你得到整個事情(即使countdown顯然是3,而不是2,1或0)。

當執行從一個case轉到另一個而不是退出switch范圍時(例如,使用break語句),你會得到“fall through”(這是Swift fallthrough關鍵字所做的)。

這在C中是相關的,因為您可以在switch語句中使用任意復雜的結構,如果需要可以使用重疊的情況。 這是一個合法的C程序:

switch (x)
{
    case 0:
        if (y == 3)
        {
    case 1:
            puts("hello");
        }
        else
        {
            puts("world");
        }

    case 2:
        puts("!");
}

然而,這種使用非常罕見並且通常難以遵循(快速!如果x == 1可以執行else分支嗎?)。 我還沒有測試過,但如果你能用Swift做類似的話,我會很驚訝。

一般來說,在C中,跌倒被認為是不好的風格,因為通常很難判斷跌倒是自願的還是由於缺少break陳述。 Swift使用fallthrough語句解決了這個問題,它明確表示您希望執行繼續執行switch語句中的下一個案例而不是退出switch范圍。

在您的情況下,您不能使用fallthrough來獲得所需的內容,因為只有在您需要的執行順序是線性時,才能使用fallthrough。 您需要跳過無效的代碼塊,因此需要使用if-else序列而不是switch語句。

如果你正在尋找其他匹配的案例而不是下一個案例(如同fallthrough ),那么switch不適合這項工作。

相反,您應該使用一系列if語句,例如:

Bool gotOne = false;
if (somePoint.0 == 0 && somepoint.1 == 0) {
    print("origin")
    gotOne = true;
}
if (somepoint.1 == 0) {
    print("y-axis")
    gotOne = true;
}
if (somepoint.0 == 0) {
    print("x-axis")
    gotOne = true;
}
:
if (! gotOne) {
    print("somewhere else")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM