見出し画像

【じっくりSw1ftUI 18】Essentials第7章〜Playgroundで遊ぼう④制御(forとかwhile、if、repeatとか)とPPP

さてと、今週も

の流れに沿って、

楽しく学んでく〜〜〜
(今日は、暑いのでビール片手に 笑🤣)

今回は、前回の記事までで既に結構、出てきてる

if(条件分岐)
for(繰り返し)

なんかを扱ってく👀んだけど、ここで結構大事になってて、今回の記事で身につけて欲しいなって作法が、

でも書いてる

疑似コードプログラミング(以下、PPP)

これをやるのにちょうど良い科目だから、

単純にコードの構造を理解する
👉知識として触れる

ではなく、

自分のやりたい処理をまずは人間の言葉で書く
👉コードに直す

って癖を身につけとこう🕺一昔前から、

  • ネットで調べればどんなサンプルコードも載ってる

  • 教科書通りにやればいい

  • 分からなければ人に聞く

  • そんな回り道しなくても、出来て当たり前

って感じで、基本文法=シンタックスを疎かにするどころか、すっ飛ばす人も

タイパ、コスパ

とやらで多くなってるんだけど、、、。

PPPで体にコードを馴染ませる👉実務に当たる

って流れができてないばかりに、いざって時に臨機応変にコードが起こせなくて、

  • 簡単なコードが書けない

  • ゼロからアプリを開発できない

👉却って、時間や人件費を無駄にしてる

からね。

急がば回れ

の精神で楽しく今回もやっていきませう🕺


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

っと、まあさすがって感じでこの章の概要でいきなり、

ここで取り扱ってる内容は、他のプログラミング言語にも共通する制御って文法ですぜ👀

ってことを書いてる。確かにVBAにしろ、Javaにしろ、GoogleAppsScript、JavaScriptにしろ、書き方が違うだけで、

  • 条件分岐:if

  • 繰り返し:for

  • 期間の判定:while

  • 場合分け:switch(VBAではselect case文に該当)👈次章なので以下では割愛

は共通してるし、プログラミング言語なんて所詮、

PCを使って、システムに人が何かをさせたいって時に、その命令文を書くために開発されたもの
👉人の行動の中で、

・条件分岐:もし○なら何かをする、もし×なら他の何かをする
(例)「80点以上ならば合格。それ以外は、不合格。」

繰り返し:◻︎から△までは何かをしろ
(例)「会員Noが1〜10000までの人の合計金額を出せ」

・期間の判定:◇になるまで何かをしろ
(例)「生徒数が300人を超えるまでは合格にし続けろ」

的な感じでね。

◾️範囲での繰り返し文:for

構文

for 回数 in コレクション か 範囲 {
   処理
}

これなんかは、よくある教科書事例で、

100回分の合計を求めたい

って時に使うんだけど

合計の初期値は0で、
100回数は、
合計に、回数分の値を足す操作を繰り返して、
結果を出力しろ

をコードに直してくと、、、

var sum7_1 = 0
for cnt7_1 in 1...100 {
    sum7_1 += cnt7_1
    print("合計は、\(sum7_1)です")
}

で結果は、

てな感じになる

じゃあ、合計の初期値が1で99回繰り返す場合は?

って感じで少しお題を変えるとして、ここは前回やったクローズドレンジを使うか、99って明記するかの違いなんだけど、

var sum7_1 = 1
for cnt7_1 in 1..<100 {
    sum7_1 += cnt7_1
    print("合計は、\(sum7_1)です")
}

て書いても

var sum7_1 = 1
for cnt7_1 in 1...99 {
    sum7_1 += cnt7_1
    print("合計は、\(sum7_1)です")
}

て書いても、

同じ結果になりました

で実は、単純な計算の場合、回数は省略もできるから、

//省略
var sum7_2 = 0
for _ in 1...100 {
    sum7_2 += 1
    print("合計は、\(sum7_2)です")
}

てな感じにすると、

てなこともできるって感じ

ただし、

可読性=読みやすさが落ちるので、あまり_で省略することをオイラはオススメしてないけどね。
(日本の市販本だと、やたらと_;って感じで構文を説明してる本も多いんだけど、、、💦)

省略できるものは省略して書いたほうが職人っぽいとか出来る人っぽいって感じで、どのプログラミング言語の現場でも、やたらと短く書こうとする人も多いんだけど、

目先で格好付けて、メンテナンスや保守、改修に却って時間かけてたら世話ないからね。

別に、そんな目先で格好つけることを職人とは言わないし、本当の職人ほど、

後工程まで考えて最初から基本に忠実に、
第三者が見ても見ればわかるように
極力、シンプルにコードは書く

からね。

//省略しない
var sum7_3 = 0
for cnt7_3 in 1...100 {
    sum7_3 += 1
    print("合計は、\(sum7_3)です")
}

で、今の段階だと、

黄色の警告は出るけど、同じ処理結果

で、パッと見

どっちが理解しやすいか?

って話。しかもその後で、

もしカウントの回数が50を超えた時には、回数も出力してほしい

なんて、依頼が追加できたらどうする?👀

って話。

//省略しない
var sum7_3 = 0
for cnt7_3 in 1...100 {
    sum7_3 += 1
    if cnt7_3 > 50 {
        print("回数は\(cnt7_3)で、合計は、\(sum7_3)です")
    } else {
        print("合計は、\(sum7_3)です")
    }
}
てな感じでね、、、👀

ま、今後出てくるXcodeを使ったGridLayoutなんかでfor文は使うから、ここでしっかり理解しておいてね〜〜〜〜

◾️期間(前判定):while

構文

while 条件 {
  処理
}

繰り返し文とよく似てる(まあ、当たり前な)んだけど、例えば、

数字の初期値は、3で
回数が10を超えない間は、2をかけて
結果を出力しろ

って感じで、コードを書くと

//while文
var num7_4 = 3
var cnt7_4 = 1
while cnt7_4 < 10 {
    num7_4 *= 2
    print("値は、\(num7_4)です")
    cnt7_4 += 1
}

てな感じで、

になる。

動かしてれば、小難しい解説もなくわかると思うんだけど、

  • while : 条件式を満たす間は処理をする

  • for:指定した回数だけ処理を繰り返す

ってだけの違いだから、別に、

for文をwhile文で、while文をfor文で

書き換えられなくはないんだけど、

  • 値がいくらの間でやりたいのか

  • 指定した回数だけは確実に処理をしたいのか

👇

  • あくまでも(クライアントとかの要求で)何をしたいのか

  • どっちがよりわかりやすいか

だけの問題

あそうそう、動かして検証しない人はよくやりがちなところなんだけど、さっきのコード

//while文
var num7_4 = 3
var cnt7_4 = 1
while cnt7_4 < 10 {
    num7_4 *= 2
    print("値は、\(num7_4)です")
    //cnt7_4 += 1 ここをコメントアウト
}

にすると、面白い結果になると思うからまあ、やってみてね〜〜〜🕺
動かしながらやってると、理由はすっごく簡単なんだけど、

頭だけでコードを書いて、
実際に検証もしない人は最初はよくやりがちだからね🤓

◾️後判定:repeat

構文

repeat {
   処理
} while 条件

ま、これは一回処理に入ってから判定するかどうかの違いだけ。

  • while:条件の判定をしてから処理をする👉前判定

  • repeat:少なくとも一回は処理に入ってから判定👉後判定

なイメージ。

//repeat:後判定
var num7_5 = 3
var cnt7_5 = 1
repeat {
    print("前判定スタート")
    num7_5 *= 2
    print("値は、\(num7_5)です")
    cnt7_5 += 1
} while cnt7_5 < -1

//while文:前判定
var num7_6 = 3
var cnt7_6 = 1
while cnt7_6 < -1 {
    print("後判定スタート")
    num7_6 *= 2
    print("値は、\(num7_6)です")
    cnt7_6 += 1
}

てコードで検証してみると一目瞭然で、

前判定だと、条件を満たしてないから、処理が一回もやられてないでしょ👀
さっきのコードをPPPで書き起こすと、

//repeat:後判定
数字の初期値は3
カウントの初期値は1
で
カウントが−1より小さいを満たさなくても、
処理を一回は通して、
    「前判定スタート」を最初に出力して
    数字に2を掛ける処理を条件まで繰り返して、
    値を出力しろ
    カウントを1増やせ


//while文:前判定
数字の初期値は3
カウントの初期値は1
で
カウントが−1より小さい時は、
    「後判定スタート」を最初に出力して、
    数字に2を掛ける処理を条件まで繰り返して、
    値を出力しろ
    カウントを1増やせ

ってことをやってるだけ。簡単でしょ👀

余談だけど、これは、他のマガジン記事なんかでも以前書いた

なんかが発祥で、世界では推奨されていて、日本ではすっ飛ばされてる気泡なんだけどね。

日本では、ドキュメンテーションSEが軽視されてるから。。。

◾️BreakとContinue

まあ、これは読んで字の如くなので〜〜〜〜

  • break:繰り返しを中断

  • continue:繰り返しを抜けて次の処理に移る

なんだけど、例えば、さっきfor文で使った

//省略しない
var sum7_3 = 0
for cnt7_3 in 1...100 {
    sum7_3 += 1
    if cnt7_3 > 50 {
        print("回数は\(cnt7_3)で、合計は、\(sum7_3)です")
    } else {
        print("合計は、\(sum7_3)です")
    }
}

を流用して

80を超えたら、繰り返しをやめる

って条件を追加してみると〜〜〜

//breakとcontinue
//省略しないを流用
var sum7_7 = 0
for cnt7_7 in 1...100 {
    sum7_7 += 1
    if cnt7_7 > 50 && cnt7_7 <= 80 {
        print("回数は\(cnt7_7)で、合計は、\(sum7_7)です")
    } else if cnt7_7 > 80{
        break
    } else {
        print("合計は、\(sum7_7)です")
    }
}
てな感じで、繰り返しがしっかり中断されてんね。

continueを使う場合だと、例えば、

合計が30になったら、合計に2を掛けてから、元の処理を繰り返せ

みたいな要求があったとして、、、

//省略しないを流用
var sum7_7 = 0
for cnt7_7 in 1...100 {
    sum7_7 += 1
    if cnt7_7 > 50 && cnt7_7 <= 80 {
        print("回数は\(cnt7_7)で、合計は、\(sum7_7)です")
    } else if cnt7_7 > 80{
        break
    } else if sum7_7 == 30 {
        sum7_7 *= 2
        print("回数は\(cnt7_7)で、合計は、\(sum7_7)です")
        continue
    } else {
        print("合計は、\(sum7_7)です")
    }
}
てな感じ

👉条件とか判定次第で、いくらでも遊べるからここは、頭でわかった気にならずに、オイラのサンプルコードを元にしてくれてもいいから色々遊んでみてね。

多分、

自分の頭の中で、こーなるって勝手にロジックを組み立てて実行してみても、想定どおりの計算結果になっていないってことも多いはず。ま、最初はね〜〜〜

プログラミングの処理結果は、実行しながら覚えるモノ
👉100の想定より、1の検証

◾️条件文:if

すでにここまで書く中で、前回でもそうだけど散々出てきてるので、構文だけ

構文

//単一条件
if 条件 {
 処理
}

まあ、正直条件がこれだけなら、前回まででやった

3項演算子

でやった方がいいかな🤔とは思うけどここで忘れちゃいけないのが、

顧客の要求は後から増える
👉単一条件が複数条件に変わる

ってこと。。。すぐに複数条件に変わったときに、

3項演算子で書いてた条件式を書き換えるのが面倒臭い
=だったら、最初から条件式で書いてた方が改修が簡単

ってこと💦

//複数条件
if 条件1 {
 処理1
} else if 条件2 {
 処理2
} else if 条件n {
 処理n
} else {
 処理1、処理2、処理n以外の処理
}

まあ、判定条件が多くなりすぎるのであれば、

場合分け:switch文を使うことをSwiftは推奨

してたはずだけど、それは次章でやりませう、、、。
まあ、Switchと複数条件も、

場合によりけり

だからね。Switch文で可読性が落ちるならifでやってた方が良かったりするし。。。

◾️真偽値の偽の判定処理:guard

構文

guard 真偽値 else {
  偽の場合だけの処理
}

ここは急にfunc関数使っちゃうけど、

//guard文
func sumOver10000(summary7_8: Double?){
    var price7_8 = summary7_8
    var resultValue7_8 = price7_8! * 1.10
    guard resultValue7_8 < 5500 else {
        print("num7_8は5500円以上です")
        return
    }
    print(resultValue7_8)
}

let lowestPrice7_8 = 100
let highestPrice7_8 = 5200
for rank7_8 in lowestPrice7_8...highestPrice7_8 {
    sumOver10000(summary7_8: Double(rank7_8))
}

で、実行結果としては、

てな感じ👀

まとめ

以前、他のマガジンの記事で

どんだけ大きなシステムも分解していけば、所詮小さなコードのかたまり

て書いたんだけど、所詮は、この制御文を使って、

その時々の要求に応じて、色々な繰り返しや判定、条件なんかで
処理を繰り返してるだけ

だからね👀

まあ、言葉にしてしまうと、

当たり前っちゃあ当たり前

なんだけど、いざ自分でゼロからコードに起こすとかアプリを作るなんてやろうとすると、途端に

  • 手が動かなくなるか

  • 想定だけで検証もせずに、実際リリースしたらバグが出まくる

なんて人を山ほど見てるから、そんな時ほど、最初に戻るけど、

疑似コードプログラミング=PPP

で、

シンプルで第三者が初めても見ても何をしてるかわかる、
読みやすいコードを起こす

をやってみてね〜〜〜〜🕺

さてと、次回は

場合分け=Switch文

章単体でやってるから内容は単純そうなんだけど、実は、どのプログラミング言語でも共通の、

defaultとbreakの罠

ってのがあるから、実務で厄介っちゃあ厄介か、、、

ではまた来週かな💦🤔🧐

記事公開後、

てな
てな
感じで〜〜〜完了

コードはほぼ、前回と同じで

でやったことをやってるだけだから、今回は割愛〜〜〜🕺


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