Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。票2すでにお二人の方の回答がついているのですが、どちらも「値型の変数をletで宣言すると、そのメンバーは変更できない」と言うことを強調する内容で、値型のコピーのプロパティを変更しても、元のプロパティは変更されないが、参照型の(参照の)コピーのプロパティを変更すると元のプロパティも変更されると言う例を。シンプルに構造体とクラスを定義しておきます。"initial"}最初は「関数aが関数bを呼び出す時に,関数bに構造体のインスタンスを引数として渡した場合,関数b内で構造体の(コピーの)プロパティの値を変更しても,関数a内の構造体のプロパティは変更されない」例をどうぞ。※これらのコードをPlaygroundなどで実行させるといっぱい警告が出ますが、今は実験のためなので無視してください。関数b1の中で確実にvarInstanceのプロパティpropの値を変更しているのですが、それはコピー元のstructInstanceには反映されていません。argInstanceのような行があるせいのように見えるかもしれませんが、クラスの場合、全く同じように書いてもそんな動作にはなりません。「関数bにクラスのインスタンスを引数として渡した場合,関数b内でクラスのプロパティの値を変更すると,関数a内のクラスのプロパティも変更され」る場合を見てみましょう。"changed"}この状態でa2()を実行すると、varInstanceのプロパティpropを書き換えると、確かにclassInstanceのプロパティpropも書き換わっています。実際に動かしてみれば違いは明白だと思うのですが、もう少し解説をしておきます。構造体のような値型の変数の場合、(概念的には)それぞれの変数が値のコピーを持ちます。"changed"を実行する直前には、こんな状態になっています。"changed"を実行するともうお分かりだと思いますが、このようになるわけです。+----+------------------+これに対して参照型であるクラスのインスタンスの場合、その本体は変数とは別の場所にあり、本体への「参照」だけが変数の中に入っています。"changed"が実行される前はこんな感じですね。"changed"が実行されると、参照型の場合、プロパティの変更は参照をたどって本体のプロパティを変更しますから、こうなるわけです。+------+上記の「値型の変数の場合、(概念的には)それぞれの変数が値のコピーを持ちます。」と言うのは、概念的なもので、実際には(大きな構造体をコピーするのは大変なので)最適化により出来るだけコピーが起こらないようにしたりもするのですが、意味的には「それぞれの変数が値のコピーを持ちます」と言うのと同じ結果が出るようにします。|1質問者さんはletとvarで変数を宣言する事の違いは理解出来るでしょうか?letでを宣言すると、letで宣言した変数は定数となり、変更が不可能(コンパイルエラー)になります。構造体についてもこれは同様で、構造体のメンバーをvarで宣言しても、構造体型の変数をletで宣言すると、構造体のメンバーは初期化時にしか変更出来なくなります。ここまでが前提で、以下がサンプルになります。これをプレイグラウンドに貼り付けると、3箇所コンパイルエラーが発生します。エラーになる箇所には、何故エラーになるのかコメントしてありますのでそれを読んでみてください。関数aが関数bを呼び出す時に,関数bにクラスのインスタンスを引数として渡した場合の具体例は以下になります。関数bに構造体のインスタンスを引数として渡した場合の具体例は、上記のUserをclassからstructへ変更したものになりますが、そうすると関数bでコンパイルエラーが発生します。(引数で渡ってきた値はletで定義したものとして扱われ、構造体はletで定義したインスタンスのプロパティは変更できないため)ですのでご質問にある関数b内で構造体のプロパティの値を変更しても,関数a内の構造体のプロパティは変更されないは、正しくは関数b内で構造体のプロパティの値は直接には変更できない(デフォルトでは)かと思います。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。