質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

533閲覧

Swift : forで似た名前のメソッドをまとめて呼び出したい

yutachan

総合スコア7

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/04/20 12:32

前提・実現したいこと

記述量を少なくするため
インスタンスのメソッドをfor文などで呼び出したい

Question01(別の)クラスからメソッドを複数個呼び出したいのですが
こういった場合 forなどで記述できるような書き方はあるのでしょうか。
現在はこう書いてます。

Q01 = Question01()

Q01.doQuestion01()
Q01.doQuestion02()
Q01.doQuestion03()
Q01.doQuestion04()
Q01.doQuestion05()
Q01.doQuestion06()

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasakiHori

2020/04/21 02:30

具体的にdoQuestion01()などが何を行うメソッドなのかが分かれば他の回答をすることが出来るかもしれません 何を行うメソッドですか?
yutachan

2020/04/21 02:37

プログラムの課題をやっておりまして 簡単な問題の答えを計算して、コンソールに表示するだけのメソッドです。
MasakiHori

2020/04/21 03:07 編集

それは関連性が一切ないメソッドを連続して実行したいということですか?
yutachan

2020/04/21 03:11

おっしゃるとおりです。 全く関連性が無く、クラスとインスタンスの生成を理解するためだけに別クラスで読んでいるだけです。
yutachan

2020/04/21 03:26

次回から質問する際は、なるべくコード全文を載せるようにします。
guest

回答2

0

基本的にはどこかで必ずやらなければならないことなので、クラスを使う側の利便性と考えて回答を付けます。
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

投稿2020/04/21 05:51

編集2020/04/21 05:57
MasakiHori

総合スコア3391

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

難しく考えすぎていました。
イニシャライザなどで勝手に質問を追加されないようにするにはシングルトンしかないのかな、と思ったのですが、これは他の方のご意見もお伺いしたいところです。

こんな感じでしょうか。

swift

1import UIKit 2 3// final にして継承できなくする 4final class Question01 { 5 //シングルトンはやめたので次の行はいらない 6 //static var sharedInstance = Question01() 7 private var questions: [() -> ()] = [] 8 9 // シングルトンじゃないので private を消去 10 init() { 11 questions.append(doQuestion01) 12 questions.append(doQuestion02) 13 questions.append(doQuestion03) 14 questions.append(doQuestion04) 15 questions.append(doQuestion05) 16 questions.append(doQuestion06) 17 } 18 19 func countOfQuestions() -> Int { 20 return questions.count 21 } 22 23 func getQuestion(_ no: Int){ 24 if no >= 0 && no < questions.count { 25 questions[no]() 26 } 27 } 28 29 private func doQuestion01() { 30 print("Q1") 31 } 32 33 private func doQuestion02() { 34 print("Q2") 35 } 36 37 private func doQuestion03() { 38 print("Q3") 39 } 40 41 private func doQuestion04() { 42 print("Q4") 43 } 44 45 private func doQuestion05() { 46 print("Q5") 47 } 48 49 private func doQuestion06() { 50 print("Q6") 51 } 52} 53// シングルトンはやめたので普通にインスタンスを作る 54//let q1 = Question01.sharedInstance 55let q1 = Question01() 56 57for i in 0..<q1.countOfQuestions() { 58 q1.getQuestion(i) 59}

投稿2020/04/20 13:55

編集2020/04/20 14:07
TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yutachan

2020/04/20 14:04

ありがとうございます。 参考にしますm(_ _)m
TsukubaDepot

2020/04/20 14:08

よく考えたら(考えなくても)シングルトンにする必要はなかったので、普通にインスタンスを作るようにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問