[英]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.