【Swift】Xcodeで始めるアプリ開発入門②

# この投稿は...

前回の[【Swift】Xcodeで始めるアプリ開発入門①](https://qiita.com/imchino/items/5b54ffecbc8e099a7e60)に続き、元素について学ぶことができる、コマンドラインインターフェース（CLI）のアプリケーションを開発します。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。
> また、Swiftプログラミングを基礎から動画で学びたい方には、Udemyコース「[今日からはじめるプログラミング](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwii1qTuj_2BAxV4hlYBHbj5BqEQFnoECBYQAQ&url=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fstart-programming-today%2F&usg=AOvVaw2vs4Sccq-bpfA4ZD2rCyNm&opi=89978449)」をお勧めします。

# ハンズオン

ユーザーの選択に基づいて、実行するコードを制御します。
さらに、ランループを構築して、ユーザーとの対話を継続できるようにします。

### ユーザーの意思に基づいて、学習方法を決定する

1. 「元素をランダムに学習するかどうか」を、ユーザーに質問します。  
そして、返答を`decision`定数に保持します。

    ```swift
    print("Select element to learn, Randomly? (Y or N)")
    let decision = readLine()!
    ```

2. `decision`定数に基づいて、「どのタスクを実行するか」を判断します。  
そのためのifステートメントを構築してください。

    ```swift
    print("Select elements to learn, Randomly? (Y or N)")
    let decision = readLine()!

    if decision == "Y" {
        print("OK! Learning element randomly.")
    } else if decision == "N" {
        print("OK, Select atomic weight of element...")
    } else {
        print("Sorry, I didn't get that.")
    }
    ```

    このifステートメントは`decision`定数が「Y」の場合、「N」の場合、あるいは「YでもNでもない」場合の3通りにコードを分岐します。

3. プログラムを実行してください。  
「Y」と「N」および「それ以外の値」を入力して、それぞれの出力を観察してください。
    
    「Y」を入力した場合

    ```console
    Select elements to learn, Randomly? (Y or N)
    Y

    OK! Learning element randomly.    
    ```

    「N」を入力した場合

    ```console
    Select elements to learn, Randomly? (Y or N)
    N

    OK, Select atomic weight of element...
    ```

    それ以外を入力した場合

    ```console
    Select elements to learn, Randomly? (Y or N)
    XYZ

    Sorry, I didn't get that.
    ```
    
### 条件分岐構文を置き換える

It条件分岐構文と同じロジックを、Switch構文で記述します。

1. If文をswitch文に変更してください。

    ```swift
    print("Select elements to learn, Randomly? (Y or N)")
    let decision = readLine()!

    switch decision {
    case "Y":
        print("OK! Learning element randomly.")
    case "N":
        print("OK, Select atomic weight of element...")
    default:
        print("Sorry, I didn't get that.")
    }
    ```

    分岐条件によっては、if構文よりswitch構文の方が読みやすいことがあります。  

2. プログラムを実行してください。  
コンソールと対話して、機能が維持されていることを観察してください。

### ランループを構築する

ユーザーが正しく入力するまで、対話を継続できるようにします。
そのためには、入力値を検証するwhileループを実装します。
そして、ユーザが「YかN」を入力するまで「返答の入力」を求めます。

1. 実行ループ中に、ユーザーが繰り返し探索できるようにします。  
`decision`定数の宣言を変数にして、既定値を「空文字」に変更してください。  
そして、ユーザー入力で値を更新します。

    ```swift
    print("Select elements to learn, Randomly? (Y or N)")
    var decision = ""

    decision = readLine()!
    switch decision {
    case "Y":
        print("OK! Learning element randomly.")
    case "N":
        print("OK, Select atomic weight of element...")
    default:
        print("Sorry, I didn't get that.")
    }
    ```

2. ユーザーが「Y」または「N」を入力するまで、タスクを繰り返すwhileループを構築してください。

    ```swift
    print("Select elements to learn, Randomly? (Y or N)")
    var decision = ""

    while !(decision == "Y" || decision == "N") {
        decision = readLine()!
        switch decision {
        case "Y":
            print("OK! Learning element randomly.")
        case "N":
            print("OK, Select atomic weight of element...")
        default:
            print("Sorry, I didn't get that.")
        }
    }
    ```

3. プログラムを実行してください。  
ユーザーが「Y」か「N」を入力するまで、ランループが繰り返されることを観察してください。

### Repeat-Whileループ

このランループは必ず、「少なくとも一度」は実行すべき処理です。
そのため、反復の開始時点で「`decision`変数がYかNか」を評価することは無意味です。

1. whileループをrepeat-whileループに置き換えます。  
そして、反復処理を行った後で終了条件を評価してください。

    ```swift
    print("Select elements to learn, Randomly? (Y or N)")
    var decision = ""

    repeat {
        decision = readLine()!
        switch decision {
        case "Y":
            print("OK! Learning element randomly.")
        case "N":
            print("OK, Select atomic weight of element...")
        default:
            print("Sorry, I didn't get that.")
        }
    } while !(decision == "Y" || decision == "N") 
    ```

2. プログラムを実行してください。  
コンソールと対話して、機能が維持されていることを観察してください。

### Xcodeのジャンプバー

コードを整理するための注釈をジャンプバーに追加します。
そうすると、コーディング中にジャンプバーをクリックして、該当コードに移動できます。

1. swhitch構文の各ケースに、「コードを後で実装する」ことを示すTODOアノテーションを挿入してください。

    ```swift
    print("Select elements to learn, Randomly? (Y or N)")
    var decision = ""

    while !(decision == "Y" || decision == "N") {
        decision = readLine()!
        switch decision {
        case "Y":
            print("OK! Learning element randomly.")
            // TODO: learn to random element.
        case "N":
            print("OK, Select atomic weight of element...")
            // TODO: let the user select atomic weight of element.
        default:
            print("Sorry, I didn't get that.")
        }
    }
    ```

2. ジャンプバーをクリックして、リストにTODOが追加されたことを観察してください。

## 全体のコード

**main.swift**

```swift
import Foundation

print("Welcome to the Elements Illustrated Book!")
print("There are 1 element")

print("What is your name?")
let yourName = readLine()!
print("Hi, \(yourName).")

print("Select elements to learn, Randomly? (Y or N)")
var decision = ""

repeat {
    decision = readLine()!
    switch decision {
    case "Y":
        print("OK! Learning element randomly.")
        // TODO: learn to random element.
    case "N":
        print("OK, Select atomic weight of element...")
        // TODO: let the user select atomic weight of element.
    default:
        print("Sorry, I didn't get that.")
    }
} while !(decision == "Y" || decision == "N")
```


# 次のステップ

続きは、「[Xcodeで始めるアプリ開発入門③](https://qiita.com/imchino/items/c10117ca9e0e2f47c047)」にて解説。
投稿を告知するので、[X(旧Twitter)のアカウント](https://twitter.com/startyourcode)フォローをお願いします。