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

# この投稿は...

前回の「[Xcodeで始めるアプリ開発入門②](https://qiita.com/imchino/items/f92c383360599586b4ee)」に続き、元素について学ぶことができる、コマンドラインインターフェース（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)」をお勧めします。

# ハンズオン

最初のオブジェクトを定義します。
オブジェクトは「データの機能や特徴」をカプセル化して、外部からその詳細を隠蔽します。
オブジェクトによってコードが抽象化されると、プログラムが読みやすくなったり、メンテナス性が向上したりします。

### LearningCenter型

「学習の拠点」をモデル化する`LearningCenter`型を、構造体として定義します。
そして、そのインスタンスを作成します。

1. プロジェクトに新しいSwiftファイルを追加します。  
メニューバーから「File > New > File...」を選択してください。

2. 追加するファイルの種別を選択します。  
「Swift File」を選択して、「Next」ボタンをクリックしてください。  

3. ファイル名は「LearningCenter.swift」と入力してください。  
そして、*Group* が「Elements Appフォルダ」であること、*Targets* の「Elements App」にチェックされていることを確認します。

4. 「Create」ボタンをクリックしてください。  
すると、ナビゲータエリアに新しいSwiftファイルが追加されます。

4. *LearningCenter.swift* ファイルを開きます。  
ここに、構造体として`LearningCenter`型を定義してください。  
さらに、「学習者」を示す`student`プロパティを変数として定義してください。

    ```swift
    import Foundation

    struct LearningCenter {
        var student: String?
    }
    ```

    オプショナルにしておくことで、`nil`の既定値が自動的に設定されます。

5. *main.swift* ファイルを開きます。  
最後の行で、`LearningCenter`型のインスタンスを作成してください。

    ```swift
    var myLearningCenter = LearningCenter()
    ```

6. プログラムが問題なくビルドできることを確認しておきます。  
メニューバーから「Product > Build」を選択するか、あるいは「⌘キー+Bキー」を押します。

### 学習を開始するためのメソッド

`LearningCenter`型に「学習を開始するためのメソッド」を実装します。

1. *LearningCenter.swift* ファイルを開きます。  
`LearningCenter`型に`start()`メソッドを定義してください。

    ```swift
    struct LearningCenter {
        ...

        func start() {
            // implementation to start for learning.
        }
    }
    ```

2. *main.swift* にある既存のコード（`myLearningCenter`インスタンスの作成を除く）を、`start()`メソッドのボディに移動してください。

    ```swift
    struct LearningCenter {
        ...

        func start() {
            // 導入パート
            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 = ""

            // ランループ
            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.")
                }
            }
        }
    }
    ```

3. `start()`メソッドでは、ユーザー名をインスタンスの`student`プロパティに設定します。  
このとき、メソッドが「自身のインスタンスのプロパティ」を変更するために、`mutating`キーワードをマークしてください。

    ```swift
    struct LearningCenter {
        ...

        mutating func start() {
            ...

            // ユーザー名の設定
            print("What is your name?")
            student = readLine()
            print("Hi, \(student!).")

            ...
        }
    }
    ```

4. *main.swift* ファイルを開きます。  
`myLearningCneter`インスタンスの`start()`メソッドを呼び出してください。
そして、`start()`メソッド完了後には、アプリケーションの終了をユーザーに知らせます。

    ```swift
    import Foundation

    var myLearningCenter = LearningCenter()
    myLearningCenter.start()
    print("Bye!")
    ```

5. プログラムを実行して、機能が失われていないことを確認してください。

*main.swift* の役割は、「インスタンスを作成して、学習を開始する」だけです。
コードが以前よりも簡潔で、読みやすくなったことを理解してください。

## 全体のコード

**main.swift**

```swift
import Foundation

var myLearningCenter = LearningCenter()
myLearningCenter.start()
print("Goodbye!")
```

**LearningCenter.swift**

```swift
import Foundation

struct LearningCenter {
    var student: String?

    mutating func start() {
        print("Welcome to the Elements Illustrated Book!")
        print("There are 1 element.")

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

        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.")
            }
        }
    }
}
```

# 次のステップ

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