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

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

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

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

Q&A

解決済

3回答

751閲覧

インスタンス化するときに、定数で構造体を宣言すると、プロパティの変更ができないのはなぜ?

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2020/04/27 09:13

インスタンス化するときに、定数で構造体を宣言すると、プロパティの変更ができないのはなぜなのでしょうか。
クラスのときは定数で宣言してもプロパティの変更ができたので混乱しています。

構造体は値型、クラスは参照型である。
なので構造体インスタンスのプロパティを変更した際(下記の例ではplayer1のhpに100を代入した際)
構造体インスタンス(Player1)を作り直す必要がある。
しかしインスタンスする際、インスタンス化定数で定義されていると作り直しができないのでvarで定義する必要がある。
と考えました。

しかし、なぜクラスの場合は定数で定義してもプロパティの変更ができるのかわかりませんでした。
定数だから変更はできないのではないでしょうか。

ご教授頂けば幸いです。宜しくおねがいします。

Swift

1struct Player { 2 var name: String 3 var hp: Int 4} 5let player1 = Player(name: "太郎", hp: 100) 6var player2 = Player(name: "二郎", hp: 60) 7 8player1.hp = 100 //エラー 9player2.hp = 100 //問題なし 10

Swift

1class Player { 2 var name: String 3 var hp: Int 4 5 init(name:String,hp:Int) { 6 self.name = name 7 self.hp = hp 8 } 9} 10let player1 = Player(name: "太郎", hp: 100) 11var player2 = Player(name: "二郎", hp: 60) 12 13player1.hp = 100 //なぜ定数なのにプロパティを変更できる?

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

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

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

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

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

guest

回答3

0

ベストアンサー

実際の実装とSwiftの言語規約の話は別ですのでその辺を取り違えないようにしてください。
と、前置きしておいて。

Swiftにおいてletはその「値」を変更しない変数(定数)を定義するための記号です。
さて、ここで変数(定数)に格納される「値」とはなんであるかが問題です。

structのような値型の場合、値とはstructなどのインスタンスそのものとなります。
ですのでletでは値型のプロパティは変更不可能となります。

classつまり参照型の場合、letで変数(定数)代入される「値」はインスタンスの参照です。
参照は概念的にわかりにくいですが、インスタンスが保管されている住所のようなものと考えてください。
つまりletによって変更が禁止されているのはインスタンスの参照ということです。
ところがプロパティの変更は参照を変更しないのでプロパティの変更は可能なのです。

住所が変わらなければ住人の服(プロパティ)が変わっても問題ないのです。

投稿2020/04/27 10:02

MasakiHori

総合スコア3384

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

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

退会済みユーザー

退会済みユーザー

2020/04/27 10:14

丁寧な回答ありがとうございました。 お陰様で理解できました。
guest

0

参照型というのは、データの実体そのものではなく、その実体がどこにおいてあるかで扱います。

というわけで参照型の定数は「データの実体がどこにあるか」が定数なので、実体のプロパティをいじっても置き場所が変わるわけではないのでそうなります

投稿2020/04/27 09:59

ozwk

総合スコア13521

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

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

退会済みユーザー

退会済みユーザー

2020/04/27 10:16

回答ありがとうございました。 「実体のプロパティをいじっても置き場所が変わるわけではない」 この箇所を読むことで理解することができました。
guest

0

答えは、すでに自分で書かれているかと思います。

構造体は値型、クラスは参照型である。

投稿2020/04/27 09:23

maisumakun

総合スコア145184

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

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

退会済みユーザー

退会済みユーザー

2020/04/27 09:42

それはわかったのですが、定数で定義してもプロパティの変更ができるのかわかりませんでした。 定数なのに変更できるのはなぜなのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問