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

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

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

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

Q&A

解決済

1回答

1816閲覧

swiftのdelegateの指定をself以外で行いたい

okashi123

総合スコア43

Swift

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

0グッド

0クリップ

投稿2018/04/04 06:13

delegateの指定に

swift

1hoge.delegate = self

を用いているのをよく見るのですが

swift

1hoge.delegate = HogeDelegate{ 2 hoge(){ 3 //処理 4 } 5}

のような感じの指定方法はありますでしょうか?

状況によってdelegateに違う処理を指定したいのですが、調べても「hoge.delegate = self」ばかりだったのでどなたか教えていただけないでしょうか。

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

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

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

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

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

fuzzball

2018/04/04 06:38

イマイチ何をしたいのか分からないのですが、self.hoge()の中で「状況によって違う処理」を行うのではダメなのでしょうか?単にdelegateを差し替えたいということであれば、適当なタイミングで適当なインスタンスをdelegateにセットすればいいと思いますが。
okashi123

2018/04/04 06:46

好みの問題だと思いますが、self.hoge()の中に「状況によって違う処理」を含めるとコードの見通しが悪くなってしまうのでできれば避けたいと思っています。delegateに対してself以外の指定の記述方法があれば知りたいと思っています。この「適当なインスタンスをdelegateにセット」というのはどのような記述になるのでしょうか
fuzzball

2018/04/04 06:54 編集

hoge.delegate = 適当なインスタンス ですが。インスタンスって分かりますか?
okashi123

2018/04/04 07:09

インスタンスは分かります、ただ「適当なインスタンス」というのがどのように記述すればいいのかが分かりません。例えば「UITableViewDelegate.delegate = hoge」だとセットに利用するhogeの定義はどのように行えばいいのでしょうか
guest

回答1

0

ベストアンサー

作り慣れてないから意外に苦労してしまった‥。

間違いなどあれば指摘して下さい。
やりたいことと違っていたらすみません。

色々定義

swift

1class Hoge { 2 var delegate: HogeDelegate? 3 func hoge() { 4 self.delegate?.hoge() 5 } 6} 7 8protocol HogeDelegate { 9 func hoge() 10} 11 12class delegateA: HogeDelegate { 13 func hoge() { 14 print("A") 15 } 16} 17 18class delegateB: HogeDelegate { 19 func hoge() { 20 print("B") 21 } 22}

実行

swift

1let hoge = Hoge() 2hoge.hoge() //=> 何も起こらない 3 4hoge.delegate = delegateA() 5hoge.hoge() //=> print "A" 6 7hoge.delegate = delegateB() 8hoge.hoge() //=> print "B"

追記

このコードは、「質問への追記・修正」欄に対しての回答として、デリゲートの切り替えを示したものです。なるべくシンプルなコードにするため、delegate変数を強参照(strong)にしていますが、実際には弱参照(weak)にすることをお勧めします。(もしくは、弱参照であることを意識してコードを書くことが必要です)

投稿2018/04/04 07:48

編集2018/04/04 12:18
fuzzball

総合スコア16731

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

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

MasakiHori

2018/04/04 09:19

それはダメです。Cocoa/CocoaTouchのdelegateはweakなプロパティなので誰かが確保しておかないとすぐに解放されます。
fuzzball

2018/04/04 09:21 編集

Cocoa/CocoaTouchじゃないですし。(敢えてweak付けてないのですが‥)
MasakiHori

2018/04/04 09:24

Cocoa/CocoaTouchでなくともいわゆるdelgateを強参照にすると循環参照が起こるので基本的にweakプロパティになっているはずです
fuzzball

2018/04/04 09:25

なってないから‥。
fuzzball

2018/04/04 09:30

あぁ、「基本的にweakプロパティになっているはずです」は一般的な話ですかね。それはそうだと思います。
MasakiHori

2018/04/04 10:03

でしたら質問者さんの意図を汲んであげてください。 質問は一般的な話のはずです。
okashi123

2018/04/04 10:05

わざわざありがとうございます。classを用意する必要があるんですね。。 javaのように匿名クラスを利用してその場で処理を用意する記述はできないのでしょうか
fuzzball

2018/04/04 10:24

それは最初に調べてみたのですが、見つけられませんでした。(「swift anonymous class」で検索。英語よく分からないので、もしかしたら出来たりして‥)
okashi123

2018/04/04 10:48

なるほどー。自分でももう少し調べてみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問