この投稿は...
前回の「Xcodeで始めるアプリ開発入門③」に続き、元素について学ぶことができる、コマンドラインインターフェース(CLI)のアプリケーションを開発します。
Swiftを基礎から学ぶには
自著、工学社より発売中の「まるごと分かるSwiftプログラミング」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。
また、Swiftプログラミングを基礎から動画で学びたい方には、Udemyコース「今日からはじめるプログラミング」をお勧めします。
ハンズオン
コードを適切に抽象化すると、読みやすさと表現力が改善されます。
そのためには「冗長なタスク」を分割して、メソッドを抽象化します。
メソッドの抽象化
start()
メソッドで行われるタスクは...
- 導入パート
- ユーザー名の設定
- 学習方法の選択
...の3つです。
それぞれを抽出して、3つのメソッドに分割します。
さらに、start()
メソッドでは何度かprint()
関数とreadLine()
関数を使用して、「ユーザーに応答を促し、入力させるコード」があります。
-
LearningCenter.swift ファイルを開きます。
「ユーザーに応答を促し、入力された値を取得する」ためのresponseToPrompt(_:)
メソッドを定義してください。
そして、このメソッドが「オブジェクトの外部から呼び出されないようにする」ため、private
をマークします。struct LearningCenter { ... private func responseToPrompt(_ prompt: String) -> String { print(prompt) return readLine()! } }
-
ユーザと対話するコードを、
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()! } }
-
「導入パート」を抽出して、
introduction()
メソッドを定義します。
このメソッドも「外部から呼び出されないようにする」ため、private
をマークします。struct LearningCenter { ... mutating func start() { ... } private func introduction() { print("Welcome to the Elements Illustrated Book!") print("There are 1 element") } }
-
start()
メソッドの「コードが抽出された部分」を、introduction()
メソッドの呼び出しに置き換えてください。struct LearningCenter { ... func start() { introduction() ... } }
-
次に、「ユーザー名を設定する」コードを抽出します。
そして、プライベートなassignStudent()
メソッドを定義してください。
このメソッドにもmutating
キーワードをマークします。struct LearningCenter { ... func start() { ... } private mutating func assignStudent() { student = responseToPrompt("What is your name?") print("Hi, \(student!).") } }
-
最後に、
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)") ... } } }
-
start()
メソッドを更新して、assignStudent()
メソッドとdetermineElement()
メソッドを呼び出します。struct LearningCenter { ... mutating func start() { introduction() assignStudent() determineElement() } ... }
-
プログラムを実行して、機能が失われていないことを確認してください。
関連するコードや反復的なコードを「適切な名前のメソッド」に再編成したことによって、コードの表現力と可読性を改善できました。
全体のコード
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)アカウントのフォローをお願いします。