見出し画像

【じっくりSw1ftUI 19】Essentials第8章〜Playgroundで遊ぼう⑤場合分け Switch文 他の言語だとbreakを入れないと全ケースを通すヤツが多いから気をつけてね

GAS(Google Apps Script)なんかを例に〜〜〜

てな感じでコードも転がってるんで、楽しんで見てね👀さてと、今回も

略して、Essentials

を楽しく暇つぶしがてらやってく〜〜🕺前回、

で予告してたとおり、今回は、

場合分け: Switch文

オイラ的には、大体、VBA以外は、Switchを使うのが一般的かなあ〜と🧐
(ま、そんなにたくさんの言語に触れたわけではないが 藁🤣)

んだば早速


第8章をじっくり読んでく

まあ概要と1節あたりで、

場合分けを使ってやった方が、条件分岐のif文よりも

可読性(読みやすさ)が上がるし、処理も早くなる

みたいなことが書いてんね👀

構文

switch 式や値 {
  case 1:
       //処理
  case 2:
       //処理
  case 3,4:
       //処理
  default:
       //処理
}

とここで、最初のうちはよくやらかすんだけど、default:は、

それ以外の場合に当てはまらない全ての場合に、実行する

って結構、強力な処理だから、

case:で網羅性がきちんと出来てないと、
意外と想定外の処理結果になったりするから気をつけてね👀
👉カバレッジ漏れに気をつけよう

と、この段階で言われても、やったことがない人は

何を言ってるのかわからない

ってなると思うから、そこもじっくりコードを書き書きしながら、実際に動かしながらで見てく〜〜〜

//シンプルな例
var num8_1 = 10
for cnt8_1 in 1...5 {
    num8_1 *= 10
    print("現在の値は、\(num8_1)")
}

みたいなコードがあるとして、単純な処理結果は、

てな感じ

これにswitch文を入れて、例えば、

10000を超えたら、毎回、ログ出力する文を切り替える

って場合に、

//シンプルな例-10000を超えたら、文を切り替え
var num8_1 = 10
for cnt8_1 in 1...5 {
    num8_1 *= 10
    switch num8_1 {
    case 10000:
        print("10000になりました")
    case 100000:
        print("100000になりました")
    case 1000000:
        print("1000000になりました")
    default:
        print("現在の値は、\(num8_1)です")
    }
}
てな感じになるんだけど、

条件式と違って、

caseで値を特定してるだけだから、最初に言った

カバレッジ漏れで場合の定義がしっかり出来てない

と、

てな感じで、1000000だと切り替わってるはずが切り替わらない

みたいなことが起きる👀

値を決めうちのパターンでよくある教室事例だと

//曜日判定-ゴミ出し日
var Weekday8_2 = 0
for cnt8_2 in 1...7 {
    switch Weekday8_2 {
    case 1,5:
        print("今日はゴミ出し日です。")
    default:
        print("ゴミ出し日ではなりません")
    }
    Weekday8_2 += 1
}
てな感じかなと。

さらに複雑にしようと思ったら、曜日がわかりやすいように代入なんかも出来なくはないんだけどね。

//曜日判定-ゴミ出し日
var Weekday8_2 = 0
var dayName8_2:String? = ""
for cnt8_2 in 1...7 {
    switch Weekday8_2 {
    case 1:
        dayName8_2 = "月曜日"
        print("今日は\(dayName8_2!)なので、ゴミ出し日です。")
    case 5:
        dayName8_2 = "金曜日"
        print("今日は\(dayName8_2!)なので、ゴミ出し日です。")
    default:
        dayName8_2 = "月金以外"
        print("\(dayName8_2!)なので、ゴミ出し日ではなりません")
    }
    Weekday8_2 += 1
}
てな感じ

あと、ここもよくやりがちなんだけど、

//曜日判定-ゴミ出し日
var Weekday8_2 = 0
var dayName8_2:String? = ""
for cnt8_2 in 1...7 {
    Weekday8_2 += 1
    switch Weekday8_2 {
    case 1:
        dayName8_2 = "月曜日"
        print("今日は\(dayName8_2!)なので、ゴミ出し日です。")
    case 5:
        dayName8_2 = "金曜日"
        print("今日は\(dayName8_2!)なので、ゴミ出し日です。")
    default:
        dayName8_2 = "月金以外"
        print("\(dayName8_2!)なので、ゴミ出し日ではなりません")
    }
}

で、

    Weekday8_2 += 1

の位置を、

for文の最初に持ってくるか、最後に持ってくるか

で、

日曜始まりか月曜始まりになるか

変わってくるから気をつけてね

てな感じ

構文だけ見て、頭だけで理解した気になってる人ほど、実際これは大きな差になるって肌感覚でわからないから、

こんな単純な(動かせば気づく)ミスで、
大きな障害とかに繋がりやすいので〜〜〜

と、ここまでは値が1個だけだったんだけど、、、

もちろん範囲でもcaseは表現できるからね👀

これもよくある教室事例だけど、、、

//成績判定-80:優 70-79:良 60-69:可 59以下:不合格
var resultPoint8_3 = 0
var testResult8_3:String? = ""
var resultPass8_3:String? = ""
for cnt8_3 in 1...11 {
    switch resultPoint8_3 {
    case 80...100:
        testResult8_3 = "優"
        resultPass8_3 = "合格"
        print("\(resultPoint8_3)点なので、\(testResult8_3!)で\(resultPass8_3!)です。")
    case 70...79:
        testResult8_3 = "良"
        resultPass8_3 = "合格"
        print("\(resultPoint8_3)点なので、\(testResult8_3!)で\(resultPass8_3!)です。")
    case 60...69:
        testResult8_3 = "良"
        resultPass8_3 = "合格"
        print("\(resultPoint8_3)点なので、\(testResult8_3!)で\(resultPass8_3!)です。")
    default:
        resultPass8_3 = "不合格"
        print("\(resultPoint8_3)点なので、\(resultPass8_3!)です。")
    }
    resultPoint8_3 += 10
}

てな感じで〜〜〜

こんな感じ〜〜〜

さらに、where文でマッチする場合を詳細に追加もできる

//成績判定-60以上は合格。合格の場合のみ値が奇数か偶数か判定
var resultPoint8_4 = 0
var testResult8_4:String? = ""
var resultPass8_4:String? = ""
for cnt8_3 in 1...20 {
    switch resultPoint8_4 {
    case 60...100 where resultPoint8_4 % 2 == 0:
        resultPass8_4 = "合格"
        print("\(resultPoint8_4)点なので、\(resultPass8_4!)です。得点は偶数")
    case 60...100 where resultPoint8_4 % 2 != 0:
        resultPass8_4 = "合格"
        print("\(resultPoint8_4)点なので、\(resultPass8_4!)です。得点は奇数")
    default:
        resultPass8_4 = "不合格"
        print("\(resultPoint8_4)点なので、\(resultPass8_4!)です。")
    }
    resultPoint8_4 += 5 //5点ずつ加算
}
てな感じ

fallthrough:直下のケースの処理を実行する

と、ここまでは変化がわかりやすいように自動的に値を増やす繰り返し文の中でやって来てたんだけど、ここの説明にはちょっとわかりにくいので、

//加算判定:61にならボーナスポイント100を足す
var resultPoint8_5 = 61
var bonusPoint8_5 = 0
switch resultPoint8_5 {
case 61:
    bonusPoint8_5 += 100
    print("\(resultPoint8_5)点です。ボーナスポイントは\(bonusPoint8_5)")
    fallthrough
default:
    bonusPoint8_5 += 1
    print("\(resultPoint8_5)点です。ボーナスポイントは\(bonusPoint8_5)")
}

てな感じのコードを実行すると、、、

該当する場合の処理をした後で、直後の処理を実行してるね👀

入れない場合だと

//加算判定:61にならボーナスポイント100を足す
var resultPoint8_5 = 61
var bonusPoint8_5 = 0
switch resultPoint8_5 {
case 61:
    bonusPoint8_5 += 100
    print("\(resultPoint8_5)点です。ボーナスポイントは\(bonusPoint8_5)")
//    fallthrough
default:
    bonusPoint8_5 += 1
    print("\(resultPoint8_5)点です。ボーナスポイントは\(bonusPoint8_5)")
}
見てのとおり、実行されてない。

なんかも参考にしてみてね。

冒頭にも書いてるけど、

JavaScriptとかGASなんかの他のプログラミング言語と違って、

でもあるとおり、

Swift : break文いらない

ってのが大きな特徴になるから気をつけてね〜〜〜〜オイラもSwift使いになってから、他の言語を書くと

つい癖でbreakを入れるの忘れる

ってことがあるからね👀

オイラの場合、コードを書いたら、必ずすぐに検証する癖があるから、
すぐに、あ!そいえば、、、って感じですぐに気づくんだけど。

頭でコードだけ書いて、想定の中だけで検証しないエンジニアさんでよくやらかすからね。
👉それでリリース前後に発覚しておおわらわなんて人山ほど見てるから。

さてと、次回は、

第9章 関数とクロージャに入ってく🕺

関数については、前回の最後で軽くやったアレ(優勝じゃないぞ)だね👀

記事公開後、

いつもどおり、

の手順でにまとめただけ〜〜〜

コード
ポイント
参考リンク

以上です👀

この記事が気に入ったらサポートをしてみませんか?