LoginSignup
1
2

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

Last updated at Posted at 2024-02-11

この投稿は...

前回の「Xcodeで始めるアプリ開発入門③」に続き、元素について学ぶことができる、コマンドラインインターフェース(CLI)のアプリケーションを開発します。

Swiftを基礎から学ぶには
自著、工学社より発売中の「まるごと分かるSwiftプログラミング」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。
また、Swiftプログラミングを基礎から動画で学びたい方には、Udemyコース「今日からはじめるプログラミング」をお勧めします。

ハンズオン

コードを適切に抽象化すると、読みやすさと表現力が改善されます。
そのためには「冗長なタスク」を分割して、メソッドを抽象化します。

メソッドの抽象化

start()メソッドで行われるタスクは...

  • 導入パート
  • ユーザー名の設定
  • 学習方法の選択
    ...の3つです。

それぞれを抽出して、3つのメソッドに分割します。

さらに、start()メソッドでは何度かprint()関数とreadLine()関数を使用して、「ユーザーに応答を促し、入力させるコード」があります。

  1. LearningCenter.swift ファイルを開きます。
    「ユーザーに応答を促し、入力された値を取得する」ためのresponseToPrompt(_:)メソッドを定義してください。
    そして、このメソッドが「オブジェクトの外部から呼び出されないようにする」ため、privateをマークします。

    struct LearningCenter {
        ...
    
        private func responseToPrompt(_ prompt: String) -> String {
            print(prompt)
            return readLine()!
        }
    }
    
  2. ユーザと対話するコードを、responseToPrompt(_:)メソッドの呼び出しに置き換えます。
    「ユーザー名を設定するコード」と「学習方法を選択するコード」です。

    struct LearningCenter {
        ...
        
        mutating func start() {
            print("Welcome to the Elements Illustrated Book!")
            print("There are 1 element")
            
            // ユーザー名の設定
            student = responseToPrompt("What is your name?")
            print("Hi, \(student!).")
            
            // ランループ
            var decision = ""
            while !(decision == "Y" || decision == "N") {
                decision = responseToPrompt("Select elements to learn, Randomly? (Y or N)")
                ...
            }
        }
    
        private func responseToPrompt(_ prompt: String) -> String {
            print(prompt)
            return readLine()!
        }
    }
    
  3. 「導入パート」を抽出して、introduction()メソッドを定義します。
    このメソッドも「外部から呼び出されないようにする」ため、privateをマークします。

    struct LearningCenter {
        ...
        
        mutating func start() {
            ...
        }
    
        private func introduction() {
            print("Welcome to the Elements Illustrated Book!")
            print("There are 1 element")
        }
    }
    
  4. start()メソッドの「コードが抽出された部分」を、introduction()メソッドの呼び出しに置き換えてください。

    struct LearningCenter {
        ...
        func start() {
            introduction()
            ...
        }
    }
    
  5. 次に、「ユーザー名を設定する」コードを抽出します。
    そして、プライベートなassignStudent()メソッドを定義してください。
    このメソッドにもmutatingキーワードをマークします。

    struct LearningCenter {
        ...
        
        func start() {
            ...
        }
    
        private mutating func assignStudent() {
            student = responseToPrompt("What is your name?")
            print("Hi, \(student!).")
        }
    }
    
  6. 最後に、start()メソッドに残っているコードを抽出します。
    そして、プライベートなdetermineElement()メソッドを定義してください。

    struct LearningCenter {
        ...
        
        mutating func start() {...}
    
        private func introduction() {...}
    
        private mutating func assignStudent() {...}
        
        private func determineElement() {
            var decision = ""            
            while !(decision == "Y" || decision == "N") {
                decision = responseToPrompt("Select elements to learn, Randomly? (Y or N)")
                ...
            }
        }
    }
    
  7. start()メソッドを更新して、assignStudent()メソッドとdetermineElement()メソッドを呼び出します。

    struct LearningCenter {
        ...
    
        mutating func start() {
            introduction()
            assignStudent()
            determineElement()
        }
    
        ...
    }
    
  8. プログラムを実行して、機能が失われていないことを確認してください。

関連するコードや反復的なコードを「適切な名前のメソッド」に再編成したことによって、コードの表現力と可読性を改善できました。

全体のコード

main.swift

import Foundation

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

LearningCenter.swift

import Foundation

struct LearningCenter {
    var student: String?

    mutating func start() {
        introduction()
        assignStudent()
        determineElement()
    }

    // 導入パート
    private func introduction() {
        print("Welcome to the Elements Illustrated Book!")
        print("There are 1 element.")
    }

    // ユーザー名の設定
    private mutating func assignStudent() {
        student = responseToPrompt("What is your name?")
        print("Hi, \(student!).")
    }

    // 学習方法の選択とランループ
    private func determineElement() {
        var decision = ""            
        while !(decision == "Y" || decision == "N") {
            decision = responseToPrompt("Select elements to learn, Randomly? (Y or N)")
            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.")
            }
        }
    }

    private func responseToPrompt(_ prompt: String) -> String {
        print(prompt)
        return readLine()!
    }
}

次のステップ

続きは、「Xcodeで始めるアプリ開発入門⑤」にて解説(予定)。
投稿を告知するので、X(旧Twitter)アカウントのフォローをお願いします。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2