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

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

ただいまの
回答率

90.36%

  • Swift

    7626questions

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

  • Xcode

    4303questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

プロパティとデリゲート

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 247

rhono

score 4

お世話になっております。

プロパティとデリゲートのことでわからないことがあります。
3つ質問させてください。
本当の本当の初期の悩みで申し訳ないです。

1
プロパティの意味からなのですが、インスタンスと頭がごっちゃになっております。
ストーリーボードの画面(iPhoneの画面)=インスタンス
スライダー=インスタンス
スライダーのつまみ、横棒、アイコン=プロパティ

画面のインスタンスが土台にあり、その上にスライダーのインスタンスが載っていて、そのスライダーを構成しているのがプロパティ
こういう認識でよいのでしょうか。

2
デリゲートなのですが、
何がわからないのかわからない状態です。

class ViewController: UIViewController. UIImagePickerControllerDelegate, UINavigationControllerDelegate {

let camera = UIImagePickerControllerSourceType.camera

if UIImagePickerController.isSourceTypeAvailable(camera){
   let picker = UIImagePickerController()
   picker.sourceType = camera
   picker.delegate = self
   self.present(picker, animated: true)

func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){
   云々
   }
}


このようなコードがあるのですが、

この、picker.delegate = selfのdelegateはself(ViewController)の代理人に設定されているのだと思うのですが、一体selfの何を代理しているのか。
代理することによって、何ができるのかわかりません。
一度そのコードを抜いて試してみました。
画面が止まったままなので、必要だということはわかったのですが、
delegateの中でどのような処理をしているのかが理解できません...

let picker = UIImagePickerController() <- モーダルビューコントローラーを作成する
picker.sourceType = camera <- モーダルビューにカメラ撮影(カメラから写真取得)の画面を設定する
picker.delegate = self <- 何を代理???
self.present(picker, animated: true) <- iPhoneの画面にカメラ画面を表示させる。


私の頭の中ではこんな感じです...

3
最後に、プロパティに設定されている型なのですが、
写真にUIImageクラスの型を設定するという行為がよくわかりません。
UIImageクラスという箱の中に写真が入れられているイメージで大丈夫でしょうか。
上記の認識で大丈夫であれば、必要性は別として、写真をString型の箱の中にも入れることができるのでしょうか。

初期の悩みで大変恐縮なのですが、教えていただけると本当に助かります。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

1.プロパティとインスタンス

プロパティは変数名、インスタンスは設計図から作った実物なので、直接対比するものではありません(正確には間違っていますが、ひとまず)。
まず、家の設計図をイメージしてください。この「設計図」が「クラス(や構造体など)」です。その設計図を元に作った「実際の家」が「インスタンス」です。そして、設計図の中には、「キッチン」、「お風呂」などがあります。それがプロパティ(設計図上にある名前)です。そして、家を建てたときにキッチンにA社製システムキッチンを取り付けたとすると、プロパティ「キッチン」にインスタンス「A社製システムキッチン」を代入した・・・となります。
ストーリーボードやスライダーも、誰か(Apple)が作ったクラス(設計図)で、それを実体化しています。そして、クラスの中にあるプロパティに、さらに細かい部品のインスタンスを代入していく、という作業を繰り返していきます。

2.デリゲート
プログラマーAは「画像を選択してサーバーにアップロードする」プログラムを作りたい、プログラマーBは「画像を選択して画像処理をする」プログラムを作りたい・・・、と言うときに、一から全部作ってしまってもいいのですが、「画像を選択する」部分は共通しているので、その部分を一つのプログラムにすると便利ですね。というわけで、誰か(Apple)がその部分を作ってくれました。それがイメージピッカーです。しかし、選択した後の処理は各プログラマーがしなければなりません。その処理を行うのがデリゲートです。デリゲートには、イメージピッカーが選んだ画像をもらうための関数などを用意する必要があります。関数名は固定ですが、その中身はプログラマが自由に記述することができます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/25 08:43 編集

    回答していただきありがとうございます!
    すみません、
    きちんと理解した上でお返事したいので、もう少し待ってください!

    キャンセル

  • 2018/04/26 09:30

    1
    インスタンスの上にインスタンスを置くことが、どうも納得できていなかった(今思えばおかしな話な)のですが、家を使って具体的に教えていただけることで、やっと理解できました。
    以前の自分は、クラスというものが画面のことで、スライダーなどはプロパティだと思っていました。
    (画面というインスタンスの上にスライダーというプロパティが乗っかっているイメージでした)

    「クラスの中にあるプロパティに、さらに細かい部品のインスタンスを代入していく、という作業を繰り返していきます」

    ということがまだ何も作ったことがないので、実感できませんが、もう一度作ってみてから振り返ってみたいと思います!


    2
    関数名を固定されているのは、その中身もこう書くべきだと思っていましたが、そうではないのですね。
    UIImagePickerControllerの後の処理の"関数名"は決まっているけど、その関数で行う処理はこっちが決めるということ、関数名はタグみたいなものなのですね。
    imagePickerController(_:didFinishPickingMediaWithInfo:)で写真を表示させるだけの処理を行った場合、
    イメージピッカーの中のdelegateは写真を表示させる設定が入っており、
    後のself.presentで写真を表示させるということなのですね。
    やっと納得できました!本当に助かります...
    ありがとうございます!

    キャンセル

checkベストアンサー

+2

 A1

ストーリーボードの画面、スライダー、スライダーのつまみ、横棒、アイコン、全てインスタンスです。
ではプロパティとは何かというと、上記のインスタンスがどのようなものなのかを表す、もしくは設定するためのものです。
例えば、表示位置(frame.origin)、サイズ(frame.size)、色(textColor, backgroundColor)などです。スライダーであれば、「今どこにツマミがあるか」という情報(value)もプロパティですね。

 A2

UIImagePickerControllerの場合だと、

  • 写真を撮ったときにはimagePickerController(_:didFinishPickingMediaWithInfo:)
  • キャンセルしたときにはimagePickerControllerDidCancel(_:)

を呼ぼうとしますが、これらの関数がどこにあるのか?(どのインスタンスの関数を呼ぶのか?)ということを伝えるためにpicker.delegate = selfとしてdelegateを設定します。

説明するの下手なのでこのくらいにしておきますw

 A3

UIImageクラスという箱の中に写真が入れられているイメージで大丈夫でしょうか。

大丈夫です。

写真をString型の箱の中にも入れることができるのでしょうか。

そのままでは入りません。写真のデータをString型に変換すれば入ります。(例えば、Base64エンコードすれば写真のデータをString型にすることが出来ます)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/25 08:43 編集

    回答していただきありがとうございます!
    すみません、
    きちんと理解した上でお返事したいので、もう少し待ってください!

    キャンセル

  • 2018/04/26 08:54

    実践的で、わかりやすい回答をいただきありがとうございます!

    A1
    プロパティとインスタンスの違い納得しました。
    教本読んで、インスタンスとプロパティの文字責めにあってたので、ごっちゃになっていました。

    A2
    プログラミングは上から下に順に実行していって、
    UIImagePickerControllerは同じクラスにある、その下の
    imagePickerController(_:didFinishPickingMediaWithInfo:)を勝手に呼ぶものだと思っていました。

    次の処理が必要な場合は、delegateで次の処理を行う場所を設定して、
    もし次の処理が必要のない場合は、delegateを設定しないという考えでよいでしょうか?

    A3
    Base64エンコード知らなかったので調べてみました。
    写真を文字列に変換するシステムがあるのですね。
    文字列に変換したらString型に入れることができる...
    驚きです...原理を調べてみます。

    キャンセル

  • 2018/04/26 09:26

    >>もし次の処理が必要のない場合は、delegateを設定しないという考えでよいでしょうか?
    delegateで呼ばれる関数が全て不要であればそれでもいいと思いますが、delegateは設定しておいて、不要な関数を用意(定義)しない、というのが一般的ではないかと思います。

    >>写真を文字列に変換するシステム
    「写真を」ではなく「バイナリデータを」です。写真限定ではありません。
    今すぐに必要なものでなければ、そういうものがあるということを覚えておくだけでいいと思います。あまり手を広げすぎると前に進まなくなりますよ。

    キャンセル

  • 2018/04/26 09:43

    お早い回答ありがとうございます。

    そうですね、おそらくそこで処理を終えるということはないと思いますが、
    delegateは設定しておく方が、あとあと融通効きますね。
    もし不要でしたら次の処理の関数を書かなくていいだけの話ですね...

    はい、必要になってから勉強したいと思います。
    まずは、swiftできちんと動くだけのアプリを作れるくらいを目指します。

    すみません、厚かましいですが、最後に教えて欲しいことがあります。
    例えば、こういうアプリを作りたいとなった時に、必要な関数などはどうやって調べたら良いのでしょうか。
    関数の実装の仕方はわかっても、どんな関数があるのか、なぜその関数を使うのか、関数を自動的に呼び出すと教本に書かれていたけど、一体その呼び出す関数はなんというものなのか(これはプロトコルに書かれている?)、こういうものはクラスリファレンス等を読み込むしかないのでしょうか。

    キャンセル

  • 2018/04/26 09:58

    公式ドキュメントを読むことは大事ですが、いきなり全部読んで覚えるのは無理です。

    例えば「写真を撮りたい」のであれば、
    ・検索 → UIImagePickerControllerを使った記事が見つかる。
    ・記事のサンプルをそのまま動かす。
    ・サンプルで使われているクラス/関数/プロパティなどを調べる。(ここで公式ドキュメント読む)
    ・余裕があれば、周辺のクラス/関数/プロパティなども調べる。

    私はこういうパターンが多いです。
    あとは、これの繰り返しで情報を蓄積していきます。
    いきなり全部知るのは無理です。

    キャンセル

  • 2018/04/26 10:16

    ありがとうございます!
    すごく、すごく参考になります!
    どうやって勉強するのか不安でしたが、
    一歩ずつでも地道に知識を蓄積していこうと思います。
    本当に助かりました。
    ありがとうございます!

    キャンセル

+1

インスタンスやプロパティのイメージがまだついてないのはオブジェクト指向の基礎的なところがまだ把握できていないのだと思います!

自分でクラスを作り、そのクラスのインスタンスを生成、そこからメンバ変数(プロパティ)を出力という感じで一つずつ進めた方がいいのではーって思いました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/25 08:43 編集

    回答していただきありがとうございます!
    すみません、
    きちんと理解した上でお返事したいので、もう少し待ってください!

    キャンセル

  • 2018/04/26 09:00

    おっしゃる通りです...

    作り方の右も左もまず何をすれば良いのかすらわかっておらず、手をつけられなかったのです...
    なんでもまず実践してみて、どこがわからないのか明確にした上で、もう一度教本読むなりした方が、理解が早いのだとわかりました。
    オブジェクト指向というものを勉強し始めて2ヶ月間悩みに悩み、無駄にしてしまいましたが、kawanboさんの教えを肝に命じてこれからも勉強します!
    ありがとうございます!

    キャンセル

  • 2018/04/26 10:24

    わからない箇所がわからないってやつですよね(TT)自分もそうだったのでわかります!

    僕の場合は、インスタンス化だったりデリゲートだったりしているコードを真似て自分で動かして改変、また別の人のコードを見て真似て動かして改変とやっていって何となく挙動がわかった上で、教本の意味も分かったという感じです

    キャンセル

  • 2018/05/10 08:17

    今、色々なサイトをみて真似しているのですが、何故かエラーばっかりになってしまって、頭が痛いです...
    プログラミング難しいと覚悟して挑んでいたのですが、こんなにも強敵だったとは...
    先が思いやられます(T^T)

    キャンセル

  • 2018/05/10 10:16

    やりたいことと、エラー内容記載して新しく質問するといいですよ!

    キャンセル

同じタグがついた質問を見る

  • Swift

    7626questions

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

  • Xcode

    4303questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。