基本的にはどこかで必ずやらなければならないことなので、クラスを使う側の利便性と考えて回答を付けます。
TsukubaDepotさんの回答の追加と考えてください。
まず、クラスを使う側にどれだけのメソッドがあるかを意識させない方法です。
クラスを使う側はとにかく楽をしたいという観点からの方法です。
class Question01 {
private var questions: [() -> Void] = []
init() {
// すべてのメソッドを配列に入れておく
self.questions = [
doQuestion01,
doQuestion02,
doQuestion03,
doQuestion04,
doQuestion05,
doQuestion06,
]
}
// すべてのメソッドを配列から取り出して順次実行する
func doAllQuestions() {
questions.forEach { f in f() }
}
private func doQuestion01() {}
private func doQuestion02() {}
private func doQuestion03() {}
private func doQuestion04() {}
private func doQuestion05() {}
private func doQuestion06() {}
}
クラスを使う側からはdoQuestion01などは隠してしまって、すべてを一度に実行するdoAllQuestionsだけを見せるようにしています。
次にQuestion01自体をSequenceにしてしまう方法です。
上のクラスを使います。
swift
1
2extension Question01: Sequence {
3 func makeIterator() -> IndexingIterator<[() -> Void]> {
4 return questions.makeIterator()
5 }
6}
7
8
9// using
10
11let q1 = Question01()
12
13// Question01がSequenceなのでArrayのように使える
14for f in q1 {
15 f()
16}
17
18// これでも一緒です
19q1.forEach { f in f() }
20