teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追加

2020/08/12 12:56

投稿

amiya
amiya

スコア1218

answer CHANGED
@@ -21,4 +21,25 @@
21
21
  その時、明記されている引数とは別に、今生成したインスタンスへの参照が`self`へと代入されます。
22
22
  そのおかげで、`self.color`と書くことで、
23
23
  「今作ったばかりのインスタンス」の中の「`color`」へとアクセスできます。
24
- その終了後に、戻り値として、インスタンスへの参照が返されて、`car`に代入されます。
24
+ その終了後に、戻り値として、インスタンスへの参照が返されて、`car`に代入されます。
25
+
26
+ > 画像ではなぜ、青下線を繋ぐ赤矢印が成立するのか。
27
+
28
+ クラスのメンバ変数は、もともとインスタンスが持っている要素だからです。
29
+ イメージとしてはクラスはただの型枠なので実体が無く個別のデータを持てません。
30
+ インスタンスは型枠に実体を与え、個別のデータを保存するエリアを確保したものです。
31
+ `Car.color`は、そういう名前の要素が存在するよという情報だけです。
32
+ 実際のデータは、`インスタンス.color`の中に保存されます。
33
+
34
+ > selfを使うと
35
+ 自クラスの変数にアクセスできる理由。
36
+
37
+ `self`には自インスタンスへの参照が入っていますので、
38
+ **オブジェクトへの参照.オブジェクトの要素**という形式でアクセスできます。
39
+ 参照を`car`に受け取って、`car.color`でその中の要素にアクセスしているのと同じです。
40
+ `car`も`self`も参照を格納しているという点では同じですので。
41
+
42
+ > 自クラスの変数(=var color : String)へのアクセスと、
43
+ インスタンス(=Car(color: "Red", wheel :4) ) へのアクセスとの関係。
44
+
45
+ これは具体的に何を聞きたいのかがよくわからなかったです。

2

追加

2020/08/12 12:55

投稿

amiya
amiya

スコア1218

answer CHANGED
@@ -10,4 +10,15 @@
10
10
  インスタンスの場所は、プログラムの実行時にインスタンスが生成された段階でメモリ空間が割り当てられます。
11
11
  メソッドは実はクラス側にあり、メソッド自身には自分のインスタンスを知る術はありません。
12
12
  なので、メソッドの呼び出し時に、隠れ引数としてそのインスタンスへの参照が`self`に代入されて渡されます。
13
- そういう仕組みなので、『`self`はクラスのインスタンスである』というのが正しいです。
13
+ そういう仕組みなので、『`self`はクラスのインスタンスである』というのが正しいです。
14
+
15
+ > 「メソッド」は、initメソッドの事でしょうか?
16
+ 「インスタンス」は、let car = Car(color: "Red", wheel :4) の事でしょうか?
17
+
18
+ `let car = Car(color: "Red", wheel :4)`により、
19
+ まずメモリの領域が確保されて、そこにCarクラスのインスタンスが生成されます。
20
+ そして自動的にイニシャライザである、init()が呼び出されます。
21
+ その時、明記されている引数とは別に、今生成したインスタンスへの参照が`self`へと代入されます。
22
+ そのおかげで、`self.color`と書くことで、
23
+ 「今作ったばかりのインスタンス」の中の「`color`」へとアクセスできます。
24
+ その終了後に、戻り値として、インスタンスへの参照が返されて、`car`に代入されます。

1

追加

2020/08/12 10:17

投稿

amiya
amiya

スコア1218

answer CHANGED
@@ -1,4 +1,13 @@
1
1
  『自分自身(クラスのインスタンス)』で正しいです。
2
2
  画像に書かれている矢印の先の、`var color : String`も、
3
3
  実際にはクラスがインスタンス化された時のインスタンス内部のメンバ変数になりますので、
4
- 画像の方も正しいです。
4
+ 画像の方も正しいです。
5
+
6
+ > では、「swiftでいうselfとは?意味と使い方の例:Xcode」のサイトに書かれている事柄はいかがでしょうか?
7
+
8
+ `self`がなぜ必要なのか?というと、インスタンスがどこにあるかは動かしてみるまではわからないからです。
9
+ クラス自身であれは、コンパイル時には場所が確定しますので、わざわざ変数を使う必要がありません。
10
+ インスタンスの場所は、プログラムの実行時にインスタンスが生成された段階でメモリ空間が割り当てられます。
11
+ メソッドは実はクラス側にあり、メソッド自身には自分のインスタンスを知る術はありません。
12
+ なので、メソッドの呼び出し時に、隠れ引数としてそのインスタンスへの参照が`self`に代入されて渡されます。
13
+ そういう仕組みなので、『`self`はクラスのインスタンスである』というのが正しいです。