[英]Alternative pattern to switch statement with enum and if statement for many different cases
[英]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.