本記事について
この記事では、2つのクラスで共通して利用するメソッドを定義する方法について紹介します。
提案するアプローチはあくまで一つの意見であり、唯一の正解ではありません。プロジェクトや状況によって最適な方法が異なることを考慮に入れ、参考にしていただければと思います。
シナリオ
画面Aと画面Bでは、特定の要素のカウント数に基づいて、デフォルトで用意された数値の配列を返すメソッドが定義されています。
func makeDefaultNumbers(elementCount: Int) -> [Int] {
switch count {
case 1:
return [100]
case 2:
return [50, 50]
case 3:
return [34, 33, 33]
default:
return []
}
}
課題として、仕様変更時に変更を見逃す可能性を減らすために、共通化したいです。
アプローチ
enumを使用しています。具体的な実装は以下の通りです。
enum ElementPercentageGenerator {
static func makeDefaultPercentages(count: Int) -> [Float] {
switch count {
case 1:
return [100]
case 2:
return [50, 50]
case 3:
return [34, 33, 33]
default:
return []
}
}
}
let percentages = ElementPercentageGenerator.makeDefaultPercentages(count: 3)
// [34, 33, 33]
ケースの定義はありませんが、static funcを使用して静的メソッドを定義しています。これにより、インスタンスを生成せずにメソッドにアクセスできます。
「インスタンス化しない」とは、状態を持たなくなることを意味し、そのenumがイミュータブルであることを示します。イミュータブルな状態は副作用を防ぎ、バグの可能性を低減させる利点があります。
以上です。