0 からアプリをリリースしてみよう！〜第二話〜

#0からアプリをリリースしてみよう！〜第二話〜
###はじめに
みなさんこんにちは。paulownia friendsです。第二話の今回はプログラミングを進めていく上で大切なちょっとしたコツや、デバックの方法などについて紹介していこうと思います。
前回の記事をまだ読んでいないよ！という方は、ぜひ[第一話](https://qiita.com/Paulownia_Friends/items/8bf74aec01c0c19af435 "第一話記事")もご覧ください。

##1.段落を揃える
swiftはpythonなどの他の言語と異なり段落を揃える必要がない言語ですが、段落をしっかり揃えてコードを記述することは意外に大切です。主な利点としては以下のようなことがあげられます。
&emsp;&emsp;1. コードを読む人が見やすく理解しやすい
&emsp;&emsp;&emsp;&emsp;→自分だけでなく審査する人にとっても読みやすいコードになる
&emsp;&emsp;2. エラーが起きた際にどの箇所が原因になっているのかわかりやすい
<br>


利点を列挙するとあまり大したことがないように思えますが、実際にTabキーを使ってインデントをしっかり揃えて書くとそのありがたみを実感できると思うので、ぜひインデントを揃えるようにしてみてください。

###実際の揃え方のコツ
- 基本はTabキーを用いてインデントし、if文などで{}を用いる際にはその中ではもう一度Tabキーを用いてさらに一段下げるようにしましょう。
- Tabキーを押すと基本的には右にずれていきますが、ずらしすぎてしまった際などは Shift+Tab を押すことで左側にずらしていくことができます。
- calssや{}内のコードが非常に大きい関数などは、どの閉じかっこ } で閉じているのか分かりづらくなってしまうことがあるので、閉じかっこの後ろにコメントをつけて分かりやすくしておくと便利です。この時、関数の中の処理を記述してから閉じかっこにコメントをつけるのではなく、関数などを定義し始める一番初めの段階でコメントをつけておくと楽です。



<br>

実際に上記のコツを意識してインデントを揃えたコードとそうでないコードの例を以下に記しましたので、見比べてみてください。
↓インデントを揃えたコード

```php5

@IBAction func backButton(_ sender: Any) {

        flag = true
        if adInterval == true{
            adInterval = false
            if interstitial.isReady {
                interstitial.present(fromRootViewController: self)
            } else {
                print("Ad wasn't ready")
                interstitial = createAndLoadInterstitial()
                let nextView = storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
                nextView.modalTransitionStyle = .crossDissolve
                nextView.modalPresentationStyle = .fullScreen
                self.present(nextView, animated: true, completion: nil)

            }
        } else{
            interstitial = createAndLoadInterstitial()
            let nextView = storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
            nextView.modalTransitionStyle = .crossDissolve
            nextView.modalPresentationStyle = .fullScreen
            self.present(nextView, animated: true, completion: nil)
            adInterval = true
        }
    }//end BackButton


```
<br>

↓インデントを無視したコード

```php5

@IBAction func backButton(_ sender: Any) {

    flag = true
          if adInterval == true{
    adInterval = false
        if interstitial.isReady {
                   interstitial.present(fromRootViewController: self)}else{ 
                    print("Ad wasn't ready")
                    interstitial = createAndLoadInterstitial()
                    let nextView =storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
          nextView.modalTransitionStyle = .crossDissolve
                nextView.modalPresentationStyle = .fullScreen
          self.present(nextView, animated: true, completion: nil)

         }
  } else{
                  interstitial = createAndLoadInterstitial()
                      let nextView = storyboard?.instantiateViewController(withIdentifier:"ViewController") as! ViewController
            nextView.modalTransitionStyle = .crossDissolve
        nextView.modalPresentationStyle = .fullScreen
            self.present(nextView, animated: true, completion: nil)
            adInterval = true}}


```

##2.print文を有効活用しよう
これも良く言われていることですが、プログラミングにおいてprint文は非常に重要です。print文を使うと、①「どこまでは正常に動作しているのか」・②「処理の順番はどうなっているのか」・③「配列の中身の数とindexは矛盾していないか」などを確認することができます。それでは、実際に①〜③のケースを例を交えて見ていきましょう。

①自信満々で書いたコード、赤エラーも出ずにbuildが通ったのにも拘らず、simulatorで見てみると思ったような動作をしてくれない...といった経験は多くの方がしていると思います。このとき、どこまでは正常に動作しているのかを確認することが問題解決の大きな手掛かりになります。そもそもの関数での処理がうまくいっていないのか、結果を画面に描画する際のコーディングがうまくいっていないのか、はたまた何か別の問題があるのか、といったことを把握した上で修正に入ると、そうでない場合よりも圧倒的に効率よく作業を進めることができます。

＜サンプルコード＞

```php5
//UserDefaultでの値の保持に問題がある場合
//保存
var Array1 = ["アイウエオ"]

@IBAction func appendButton(_ sender: Any) {
   Array1.append("あいうえお")
   UserDefaults.standard.set(Array1, forkey:"Array1Key")
}

//読み出し
if UserDefaults.standard.object(forKey: "ArrayKey") != nil {
   Array1 = UserDefaults.standard.object(forKey: "Array1Key") as! [String]
}

//Array1の中身を確認
print(Array1)
```
この時、書いた側としては、アプリを終了させたとしても、Array1 = ["アイウエオ", "あいうえお"]が残るようになって欲しいはずです。ですが、実際にやってみると、Array1 = ["アイウエオ"]となってしまっていました。このような時の原因究明にprint文が役立ちます。この場合における考えうる原因として、1.ボタンの関数が上手く動いていない, 2.保存が上手くいっていない, 3.読み出しが上手くいっていないなどがあります。そこで、このようなコードにしてみると

```php5
//UserDefaultでの値の保持に問題がある場合
//保存
var Array1 = ["アイウエオ"]

@IBAction func appendButton(_ sender: Any) {
   Array1.append("あいうえお")
   UserDefaults.standard.set(Array1, forkey:"Array1Key")
   print(Array1)
   print("ボタンは押せてる")
}

//読み出し
if UserDefaults.standard.object(forKey: "ArrayKey") != nil {
   Array1 = UserDefaults.standard.object(forKey: "Array1Key") as! [String]
   print("読み出しは実行されてる")
}
```
デバッグエリアに、["アイウエオ", "あいうえお"], ボタンは押せてる,読み出しは実行されてる、と表示されるはずです。そこで、1.と2.の可能性が消えて3の可能性が残り、もういちど読み出しのコードを丹念に見ていくとUserDefaultsのforeKeyが違うことに気づくはずです。このように、print文を使って自分がどこまでできているのかを把握する手段はとても有効です。


②ある file(例 ViewController.swift)内にて配列に値を追加して、それを別の fileで読み出そうとしたのに、上手く読み出せなくてout of rangeの赤エラー...といったエラーも時には起こります。また、同じようなケースとして、遷移時に、コードで遷移してついでに何か動作を行うはずなのに、上手く動作が行われないまま遷移だけがなされてしまう...といったエラーもたまに起こるでしょう。そのような時に、print文を用いて処理の順番を確認すると上手く問題を解決することができます。

③端末内完結型のツールアプリを作る上で、配列を使いこなすことは必須になるでしょう。その時に、配列のindexと中身の個数が矛盾してしまい、out of langeとXcodeに言われてしまう、ということは多々起こりうるかと思います。そのような時に、print文で配列とindexを両方確認すると、問題の解決がスムーズになることがあります。配列に新たに要素を加える時、抜く時、入れ替える時などにそのようなprint文を実行することで、問題の把握が容易になり、問題解決が素早くなります。
例↓
![スクリーンショット 2021-05-01 0.09.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128140/afcf3125-3e0b-c3cf-f25d-df805cacec98.png)

##次回予告
次回は、コーディングをする際に必須となるXcodeの使い方に関して説明していきたいと思います。変数の名前を後からまとめて変えたいけど一個一個直すのが面倒...という方向けの、変数の名前を一気に変更する方法など、Xcodeを使いこなす上で知っておきたい様々な機能を紹介します！次回もお楽しみに！

##自分たちのアプリの宣伝
私たちは、自作のリマインダーアプリ「タスクリマインダー -TaskReminder 課題管理-」、決断代行アプリ「決断メーカー」をAppStoreにて公開しています。

~ダウンロードはこちらから~
 [タスクリマインダー -TaskReminder 課題管理-](https://apple.co/3drJswx "タスクリマインダー -TaskReminder 課題管理- App Store")
 [決断メーカー](https://apple.co/2R38PgL "決断メーカー App Store")