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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

iOS

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

Swift

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

Q&A

解決済

3回答

5325閲覧

selfとは、そのクラス自体のことですか?【Swift】

kazuki_user

総合スコア147

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

iOS

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

Swift

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

0グッド

1クリップ

投稿2020/08/12 07:09

編集2020/08/12 07:09

## selfとは、そのクラス自体のことですか?

下記画像にて、selfCarクラスを指すのでしょうか?
その場合、青色の線の関係がしっくりくるのですが..????

swiftでいうselfとは?意味と使い方の例:Xcode

しかし、他サイトにて

swiftにおいて、クラスのインスタンスメソッド内でのselfは自分自身(クラスのインスタンス)を示します

という解説を見たのですが、どちらが正しいのでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

『自分自身(クラスのインスタンス)』で正しいです。
画像に書かれている矢印の先の、var color : Stringも、
実際にはクラスがインスタンス化された時のインスタンス内部のメンバ変数になりますので、
画像の方も正しいです。

では、「swiftでいうselfとは?意味と使い方の例:Xcode」のサイトに書かれている事柄はいかがでしょうか?

selfがなぜ必要なのか?というと、インスタンスがどこにあるかは動かしてみるまではわからないからです。
クラス自身であれは、コンパイル時には場所が確定しますので、わざわざ変数を使う必要がありません。
インスタンスの場所は、プログラムの実行時にインスタンスが生成された段階でメモリ空間が割り当てられます。
メソッドは実はクラス側にあり、メソッド自身には自分のインスタンスを知る術はありません。
なので、メソッドの呼び出し時に、隠れ引数としてそのインスタンスへの参照がselfに代入されて渡されます。
そういう仕組みなので、『selfはクラスのインスタンスである』というのが正しいです。

「メソッド」は、initメソッドの事でしょうか?

「インスタンス」は、let car = Car(color: "Red", wheel :4) の事でしょうか?

let car = Car(color: "Red", wheel :4)により、
まずメモリの領域が確保されて、そこにCarクラスのインスタンスが生成されます。
そして自動的にイニシャライザである、init()が呼び出されます。
その時、明記されている引数とは別に、今生成したインスタンスへの参照がselfへと代入されます。
そのおかげで、self.colorと書くことで、
「今作ったばかりのインスタンス」の中の「color」へとアクセスできます。
その終了後に、戻り値として、インスタンスへの参照が返されて、carに代入されます。

画像ではなぜ、青下線を繋ぐ赤矢印が成立するのか。

クラスのメンバ変数は、もともとインスタンスが持っている要素だからです。
イメージとしてはクラスはただの型枠なので実体が無く個別のデータを持てません。
インスタンスは型枠に実体を与え、個別のデータを保存するエリアを確保したものです。
Car.colorは、そういう名前の要素が存在するよという情報だけです。
実際のデータは、インスタンス.colorの中に保存されます。

selfを使うと

自クラスの変数にアクセスできる理由。

selfには自インスタンスへの参照が入っていますので、
オブジェクトへの参照.オブジェクトの要素という形式でアクセスできます。
参照をcarに受け取って、car.colorでその中の要素にアクセスしているのと同じです。
carselfも参照を格納しているという点では同じですので。

自クラスの変数(=var color : String)へのアクセスと、

インスタンス(=Car(color: "Red", wheel :4) ) へのアクセスとの関係。

これは具体的に何を聞きたいのかがよくわからなかったです。

投稿2020/08/12 07:21

編集2020/08/12 12:56
amiya

総合スコア1218

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

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

kazuki_user

2020/08/12 07:32

ご返信ありがとうございます。 では、「swiftでいうselfとは?意味と使い方の例:Xcode」のサイトに書かれている事柄はいかがでしょうか? selfはCarクラスを指すのでしょうか?
maisumakun

2020/08/12 07:33

単に正しくない記事です。
kazuki_user

2020/08/12 12:27

ご丁寧な説明どうもありがとうございました! おかげ様で「self」を理解できた気がします。 init呼び出し時に、インスタンスへの参照がselfへと代入され、 selfはインスタンス へアクセス出来るようになり、 self.colorで、インスタンスの「color」へとアクセス出来る、のですね。 また、もう一点質問させて頂いても宜しいでしょうか?
kazuki_user

2020/08/12 12:33

> var color : Stringも、実際にはクラスがインスタンス化された時のインスタンス内部のメンバ変数になりますので、画像の方も正しいです。 画像ではなぜ、青下線を繋ぐ赤矢印が成立するのか。 selfを使うと 自クラスの変数にアクセスできる理由。 自クラスの変数(=var color : String)へのアクセスと、 インスタンス(=Car(color: "Red", wheel :4) ) へのアクセスとの関係。 ご返信お待ちしております。
kazuki_user

2020/08/12 13:48 編集

了解です。無事解決しました。 度重なるご回答、どうもありがとうございました。
guest

0

文字通り、『自分自身』を指す。

selfと呼ばれるプロパティを全てのインスタンスが持ってます。
それは、自分自身を表します。

投稿2020/09/17 08:41

kazuki_user

総合スコア147

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

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

0

どちらが正しいのでしょうか?

「自分自身(クラスのインスタンス)を示します」。

投稿2020/08/12 07:13

maisumakun

総合スコア145184

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

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

kazuki_user

2020/08/12 07:52

init内でのselfは、自分自身(init)を示すのでしょうか? その場合、何故selfを使うとinitの外側のメンバ変数を参照できるのでしょうか? ----------- selfを使うことで何故、 自分のクラス内の何かにアクセスできるのか、教えて頂きたいです。
maisumakun

2020/08/12 07:54

> 自分自身(init)を示すのでしょうか? 違います。いま作成中のインスタンスを指します。
kazuki_user

2020/08/12 08:35

「いま作成中のインスタンス」とは、let car = Car(color: "Red", wheel :4) の事でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問