簡體   English   中英

swift switch語句案例有不同和共享的事情要做

[英]swift switch statement cases have different and shared things to do

我有這樣的代碼

switch thing {
  case thisThing:
     do thing #1
     do thing #2
  case thatThing:
     do thing #2
     do thing #3
  case anotherThing:
     do thing #4
  default:
     default
}

因此,每種情況都只有它能做到的事情。 有些案例也與一個或多個其他案件做同樣的事情。

如果我不想要任何重復的代碼,有沒有辦法實現這一目標?

或者,有沒有一個更有效的方法來做這個沒有開關語句? 我的意思是,我可以,例如,我可以使用if語句,但是像switch語句一樣,我想不出一種方法來實現我想要的而不使用重復代碼。

此外,這個例子可能比上面更清楚

myFavoriteNumbers = []
myLeastFavoriteNumbers = []

switch myNumber {
case 1:
  print("my number is number 1") // do this only for case 1
  myFavoriteNumbers += [1] // do this for case 1 and case 2
case 2:
  print("this is number 2") // do this only for case 2
  myFavoriteNumbers += [2] // do this for case 1 and case 2
case 3:
  print("I don't like number 3") // do this only for case 3
  myLeastFavoriteNumbers += [3] // do this for case 3 and case 4
case 4:
  print("Number Four") // do this only for case 4
  myLeastFavoriteNumbers += [4] // do this for case 3 and case 4
default:
  print("Default")
}

您可以使用初始單獨的模式匹配語句(與獨立於switch語句的單個case相比),該語句涵蓋對任何(有效)數字唯一的操作,並讓switch語句跟隨處理常見操作的情況幾個數字。 通過這種方式,您可以分離唯一和通用的邏輯操作,后者只是作為任何模式匹配switch實現的通常情況實現。

例如,為您的例子

var myFavoriteNumbers: [Int] = []
var myLeastFavoriteNumbers: [Int] = []
let myNumberDescriptions = ["my number is number 1",
    "this is number 2", "I don't like number 3", "Number Four"]

let myNumber = 1

/* unique action:
    perform a unique action (given a valid number)
    and thereafter proceed to common cases */
if 1...myNumberDescriptions.count ~= myNumber {
    print(myNumberDescriptions[myNumber-1])
}

/* common cases */
switch myNumber {

/* common case: is a favourite number */
case 1...2: myFavoriteNumbers += [myNumber]

/* common case: is a least favourite number */
case 3...4: myLeastFavoriteNumbers += [myNumber]

default:
    print("Default")
}

如果任何數字唯一的操作更復雜,請使用與上面相同的方法,但對於唯一操作“case”使用更高級的邏輯(例如,事件處理程序)。

您可以嵌套切換相同值的switch語句,如下所示:

switch myNumber {
case 1...2:
    myFavoriteNumbers += [myNumber] // do this for case 1 and case 2
    switch myNumber {
    case 1:
        print("my number is number 1") // do this only for case 1
    default:
        print("this is number 2") // do this only for case 2
    }
case 3...4:
    myLeastFavoriteNumbers += [myNumber] // do this for case 3 and case 4
    switch myNumber {
    case 3:
        print("I don't like number 3") // do this only for case 3
    default:
        print("Number Four") // do this only for case 4
    }
default:
    print("Default")
}

不是你能看到的最優雅的代碼,但它實現了你想要實現的目標而不重復。

作為一個明顯的解決方案,腦海中浮現在腦海中,但正如這里的某些人已經說它不會以一種有用的方式工作。

我沒有任何銀彈,但我想我會以這樣的方式解決這個問題:

創建一個僅包含單獨邏輯的switch語句

創建第二個switch語句,它結合了常見的邏輯

switch thing {
case thisThing:
   do thing #1
case thatThing:
   do thing #4
case anotherThing:
   do thing #5
default: ()
}

switch thing {
case thisThing, thatThing:
   do thing #2
default: ()
}

當你的邏輯不依賴於函數調用的順序時它會起作用(它不應該,如果這樣做,它可能是改進你的代碼設計的標志)。 對我來說它看起來很干凈,但它仍然不理想..

暫無
暫無

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

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