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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

2回答

3514閲覧

UIImageViewクラスのimageプロパティについて

monokuro

総合スコア33

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

2グッド

2クリップ

投稿2015/02/10 10:29

参考書を読んでいたら、UIImageViewクラスから生成されたインスタンスがimageプロパティを使用していました。そしてそのimageプロパティはオプショナルのUIImage型だと説明がありました。実際imageについて公式ドキュメントでも、
var image: UIImage? { get set }
と宣言がしてあり、UIImage型で宣言してありました。

オプショナルの意味はわかってるつもりでいるのですが、このUIImage型の意味がわかりません。型というとIntやDoubleなどという認識だったので混乱してます。UIImage型とはUIImageクラスで宣言されたプロパティということですか?またどういう意味があるんでしょうか?

初心者ですが、回答よろしくお願いします。

yamada_24, Teratopi👍を押しています

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

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

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

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

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

guest

回答2

0

こんにちは。

Optionalについてはおわかりになられているとのことですが、はじめに念のため、Optionalとはなにかについて確認をさせていただきます。

Appleのドキュメントには、Swiftが’Type Safety’な言語であることが書かれています。
これが具体的にどのようなことを意味するのかといいますと、String型にInt型を代入することや、String型などの通常の型にnilを代入することはできないということです。

Swiftは、nilを許容しませんので、たとえば、つぎのようなコードは静的な型チェックでエラーとなってしまいます。

lang

1var myValue: Int = nil //エラー

しかし、値がない変数を使用することは頻繁にあります。
そこで登場するのがOptionalです。変数の型をOptionalにすることで、nilを代入することが可能となります。これを指定するには、変数の宣言時に型のうしろに「?」をつけます。

lang

1var myValue: Int? = nil //問題なし

とすることでnilを代入することが可能となります。

つまり、Optional型は、値がはいっていない、または、はいらないかもしれない変数を宣言する場合に使用されます。Optionalの言葉が示すとおり、随意的(オプション)に変数を指定するという考え方です。

前置きが長くなりましたが、ここからようやく本題です。

monokuroさんの質問のなかで問題となっている UIImageはクラスであり、Swiftでは型にふくまれます。
ということで、

lang

1var image: UIImage? { get set }

とすることには、なんら問題はありません。

ここで、Swiftの公式ドキュメント(リンク)をみてみましょう。型について説明している箇所の冒頭にはつぎのように書いてあります。

In Swift, there are two kinds of types: named types and compound types. A named type is a type that can be given a particular name when it is defined. Named types include classes, structures, enumerations, and protocols. For example, instances of a user-defined class named MyClass have the type MyClass. In addition to user-defined named types, the Swift standard library defines many commonly used named types, including those that represent arrays, dictionaries, and optional values.
(拙訳)Swiftには2種類の型、名前付き型と複合型とがあります。名前付き型は、定義の際に特定の名前があたえられることでつくられる型です。名前付き型は、クラス、構造体、列挙型、プロトコルをふくみます。たとえば、MyClassという名前がつけられたユーザー定義のクラスのインスタンスは、MyClass型をもちます。ユーザー定義の名前付き型にくわえて、Swift標準ライブラリは、配列、辞書、Optionalの値をあらわすものをふくめ、一般的に使用される多くの名前付き型を定義します。

monokuroさんが、質問のなかで取りあげられている Intや Doubleなども名前付き型にふくまれます。

【おまけ】オブジェクトとは、ひとつのテーマをもったデータ(プロパティ)と処理(メソッド)の集まりです。物理的なものでも抽象的なものでも、具体的に識別できるものであればオブジェクトとしてあつかうことができます。
クラスはオブジェクトの設計書で、それが実体となったものをインスタンスといいます。インスタンスとオブジェクトは、おなじ意味で使われることが多いのですが、インスタンスといった場合は必ずクラスを意識しています。
noppefoxwolfさんとのコメントでのやりとりのなかに、「オブジェクト」についての記述がありましたので、かんたんに説明させていただきました。

以上、ご参考いただければ幸いです。

投稿2015/02/12 03:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

monokuro

2015/02/12 07:52

こんにちは。とても詳しく回答していただきありがとうございます! 今回はnoppefoxwolfさんの回答をベストアンサーに選ばさせていただきましたが、GeorgeCohtaさんの型の説明とてもわかりやすかったです。 お二人のおかげでだいぶ型についてわかった気がします。 また機会がありましたらよろしくお願いします!
退会済みユーザー

退会済みユーザー

2015/02/13 01:53

monokuroさん、コメント(返信)をいただきありがとうございます。 ベストアンサーの件は当然だと思います。(僕は、noppefoxwolfさんの回答と、おふたりのコメントのやりとりに捕捉しただけですので……) いずれにしても、僕の回答も、すこしはmonokuroさんのお役に立てたようで、とてもうれしいです。 こちらこそ、今後ともよろしくお願いします。
guest

0

ベストアンサー

UIImageは画像を管理するクラスとなっています。

lang

1UIImage(named:"filename")

のように生成することで、画像をオブジェクトとして扱う事ができます。
UIImage自体はあくまで画像のオブジェクトなので表示する機能を持っていません。
UIImageViewはプロパティのUIImageを表示するビューなので、UIImageのプロパティを持っているということです。
またオプショナルの意味はご存知とのことですが、UIImageのプロパティがnilである場合はUIImageViewは何も画像を描画されずに表示されます。

投稿2015/02/10 15:37

noppefoxwolf

総合スコア231

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

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

monokuro

2015/02/11 01:13

また回答していただいてありがとうございます! ただまたいまいち理解できません。 UIImageViewの親クラスがUIImageで、UIImageクラスのプロパティを継承してるということではないですよね?
noppefoxwolf

2015/02/11 04:21

UIImageViewの親クラスはUIViewとなります。 書いてみると分かるのですが、UIImageViewからは直接UIImageのプロパティにアクセスすることは出来ません。 例えばUIImageのプロパティscaleを取得する際は imageView.image.scale となります。(imageViewはUIImageViewのインスタンス) UIImageViewの実装部分を覗くことは出来ませんが、恐らくsetimageでUIImage型を取得しそのUIImageを描画するという作りになっているはずです。
monokuro

2015/02/11 06:28

うーん、とても丁寧に説明して頂いてるのはわかるんですが、未熟ゆえに説明自体にわからないことがちらほらあるので確認させてください。 「画像をオブジェクトとして扱う事ができます。 」とありますが、このオブジェクトとはなんですか?インスタンス?型? 「UIImageのプロパティを持っているということです。 」とありますが、これはUIImageクラスで宣言されたプロパティをUIImageViewが持ってるということですか?それともUIImageクラスのインスタンス?がUIImageViewのプロパティに入ってるということですか? imageView.image.scaleのようにドットが2つ付くような使い方をまだ知りません。形的には「インスタンス.プロパティ.プロパティ」となるんでしょうか? そして真ん中のプロパティにはUIImageのインスタンスが入ってるですか?(たぶんこの部分についてはすでに説明してくださってると思うんですが理解できてません。) やっぱり今回のUIImage型やUILabel型のような、「クラス名+型」がどういう意味をもつのかわかりません。Int型やString型とは別物という風に考えたほうがいいのでしょうか? 質問攻めで申し訳ないです。
noppefoxwolf

2015/02/11 07:40

まず最初にUIImage型やUILabel型のような、「クラス名+型」はInt型やString型と同じように考えて頂いて問題無いかと思います。 >「画像をオブジェクトとして扱う事ができます。 」とありますが、このオブジェクトとはなんですか?インスタンス?型? UIImageインスタンスはUIImage型なのでそれを総称してオブジェクトと表現しました。 >「UIImageのプロパティを持っているということです。 」とありますが、これはUIImageクラスで宣言されたプロパティをUIImageViewが持ってるということですか?それともUIImageクラスのインスタンスがUIImageViewのプロパティに入ってるということですか? 両方正しいです。 UIImageViewのimageプロパティは空のUIImageインスタンスであり、それをプロパティを通じてset/getします。 >imageView.image.scaleのようにドットが2つ付くような使い方をまだ知りません。形的には「インスタンス.プロパティ.プロパティ」となるんでしょうか? その通りです。 >そして真ん中のプロパティにはUIImageのインスタンスが入ってるですか?(たぶんこの部分についてはすでに説明してくださってると思うんですが理解できてません。) その通りです。 imageView.getimage().scaleと同じ意味になります。 プロパティで宣言する事で、get/setとプライベート変数の宣言を省略していると考えるとわかりやすいかもかしれません。
monokuro

2015/02/11 08:37

なるほどー、だんだんわかってきました。 ただget/setについてまだ知りません。getimage()というのもget/setが関係してるんですか? 簡単でいいので少し説明していただけないでしょうか?
noppefoxwolf

2015/02/11 14:13

クラス内にプライベート変数を用意し、その変数の取得・代入をget~/set~のメソッドを実装して制御する方法がgetter/setterです。 プロパティを宣言しても変数宣言・取得・代入が出来るためほぼ同意となります。(getter/setterの実装を簡略化するためにプロパティがObjective-Cに実装されたという流れだった気がします)
monokuro

2015/02/12 07:46

おかげさまで、だいたいではありますがわかった気がします! いつもたくさんコメントを返していただいて、とても感謝しています。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問