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

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

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

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

Swift

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

Q&A

解決済

3回答

1249閲覧

プロパティとデリゲート

rhono

総合スコア12

Xcode

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

Swift

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

0グッド

1クリップ

投稿2018/04/24 01:08

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

プロパティとデリゲートのことでわからないことがあります。
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型の箱の中にも入れることができるのでしょうか。

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

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

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

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

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

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

guest

回答3

0

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

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

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

投稿2018/04/24 01:45

AOKINAO

総合スコア268

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

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

rhono

2018/04/24 23:45 編集

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

2018/04/26 00:30

1 インスタンスの上にインスタンスを置くことが、どうも納得できていなかった(今思えばおかしな話な)のですが、家を使って具体的に教えていただけることで、やっと理解できました。 以前の自分は、クラスというものが画面のことで、スライダーなどはプロパティだと思っていました。 (画面というインスタンスの上にスライダーというプロパティが乗っかっているイメージでした) 「クラスの中にあるプロパティに、さらに細かい部品のインスタンスを代入していく、という作業を繰り返していきます」 ということがまだ何も作ったことがないので、実感できませんが、もう一度作ってみてから振り返ってみたいと思います! 2 関数名を固定されているのは、その中身もこう書くべきだと思っていましたが、そうではないのですね。 UIImagePickerControllerの後の処理の"関数名"は決まっているけど、その関数で行う処理はこっちが決めるということ、関数名はタグみたいなものなのですね。 imagePickerController(_:didFinishPickingMediaWithInfo:)で写真を表示させるだけの処理を行った場合、 イメージピッカーの中のdelegateは写真を表示させる設定が入っており、 後のself.presentで写真を表示させるということなのですね。 やっと納得できました!本当に助かります... ありがとうございます!
guest

0

ベストアンサー

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/24 01:35

fuzzball

総合スコア16731

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

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

rhono

2018/04/24 23:45 編集

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

2018/04/25 23:54

実践的で、わかりやすい回答をいただきありがとうございます! A1 プロパティとインスタンスの違い納得しました。 教本読んで、インスタンスとプロパティの文字責めにあってたので、ごっちゃになっていました。 A2 プログラミングは上から下に順に実行していって、 UIImagePickerControllerは同じクラスにある、その下の imagePickerController(_:didFinishPickingMediaWithInfo:)を勝手に呼ぶものだと思っていました。 次の処理が必要な場合は、delegateで次の処理を行う場所を設定して、 もし次の処理が必要のない場合は、delegateを設定しないという考えでよいでしょうか? A3 Base64エンコード知らなかったので調べてみました。 写真を文字列に変換するシステムがあるのですね。 文字列に変換したらString型に入れることができる... 驚きです...原理を調べてみます。
fuzzball

2018/04/26 00:26

>>もし次の処理が必要のない場合は、delegateを設定しないという考えでよいでしょうか? delegateで呼ばれる関数が全て不要であればそれでもいいと思いますが、delegateは設定しておいて、不要な関数を用意(定義)しない、というのが一般的ではないかと思います。 >>写真を文字列に変換するシステム 「写真を」ではなく「バイナリデータを」です。写真限定ではありません。 今すぐに必要なものでなければ、そういうものがあるということを覚えておくだけでいいと思います。あまり手を広げすぎると前に進まなくなりますよ。
rhono

2018/04/26 00:43

お早い回答ありがとうございます。 そうですね、おそらくそこで処理を終えるということはないと思いますが、 delegateは設定しておく方が、あとあと融通効きますね。 もし不要でしたら次の処理の関数を書かなくていいだけの話ですね... はい、必要になってから勉強したいと思います。 まずは、swiftできちんと動くだけのアプリを作れるくらいを目指します。 すみません、厚かましいですが、最後に教えて欲しいことがあります。 例えば、こういうアプリを作りたいとなった時に、必要な関数などはどうやって調べたら良いのでしょうか。 関数の実装の仕方はわかっても、どんな関数があるのか、なぜその関数を使うのか、関数を自動的に呼び出すと教本に書かれていたけど、一体その呼び出す関数はなんというものなのか(これはプロトコルに書かれている?)、こういうものはクラスリファレンス等を読み込むしかないのでしょうか。
fuzzball

2018/04/26 00:58

公式ドキュメントを読むことは大事ですが、いきなり全部読んで覚えるのは無理です。 例えば「写真を撮りたい」のであれば、 ・検索 → UIImagePickerControllerを使った記事が見つかる。 ・記事のサンプルをそのまま動かす。 ・サンプルで使われているクラス/関数/プロパティなどを調べる。(ここで公式ドキュメント読む) ・余裕があれば、周辺のクラス/関数/プロパティなども調べる。 私はこういうパターンが多いです。 あとは、これの繰り返しで情報を蓄積していきます。 いきなり全部知るのは無理です。
rhono

2018/04/26 01:16

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

0

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

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

投稿2018/04/24 01:36

kakeiteiya

総合スコア252

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

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

rhono

2018/04/24 23:45 編集

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

2018/04/26 00:00

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

2018/04/26 01:24

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

2018/05/09 23:17

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

2018/05/10 01:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問