注意:素人の条件を先に。
この説明は、最も重要なコードレベルでは厳密には正しくありません。しかし、それは実際にSwiftに取り組んでいる男によってレビューされており、彼はそれは基本的な説明として十分に良いと言いました。
だから私は簡単かつ直接的に試してみたい、「なぜ」という質問答えます。
正確には:構造体関数を次のようにマークする必要があるのはなぜですかmutating
、キーワードを変更せずに構造体パラメーターを変更できる場合に、ですか?
つまり、全体像は、Swiftを迅速に保つという哲学に大きく関係しています。
実際の物理アドレスを管理する問題のように考えることができます。あなたがあなたの住所を変えるとき、あなたの現在の住所を持っている人がたくさんいるならば、あなたは引っ越したことを彼ら全員に通知しなければなりません。しかし、誰もあなたの現在の住所を持っていない場合、あなたは好きなところに移動することができ、誰も知る必要はありません。
この状況では、Swiftは郵便局のようなものです。多くの連絡先を持つ多くの人が頻繁に移動する場合、オーバーヘッドが非常に高くなります。これらのすべての通知を処理するには、大きなスタッフを雇う必要があり、プロセスには多くの時間と労力がかかります。そのため、Swiftの理想的な状態は、町の全員ができるだけ少ない連絡先を持つことです。そうすれば、住所の変更を処理するために大きなスタッフを必要とせず、他のすべてをより速くより効率的に行うことができます。
これは、Swiftの人々がすべて、値の型と参照の型について熱狂している理由でもあります。本質的に、参照タイプは「接点」をあちこちに配置し、値タイプは通常2つ以上必要としません。値のタイプは "Swift" -erです。
したがって、小さな画像に戻ります。 structs
。Swiftでは、構造体はオブジェクトが実行できるほとんどのことを実行できるため、構造体は重要ですが、値型です。
にmisterStruct
住んでいるを想像して、物理アドレスのアナロジーを続けましょうsomeObjectVille
。ここで類推は少し複雑になりますが、それでも役に立ちます。
だから、上の変数を変更するモデルにstruct
、ましょうと言うには、misterStruct
緑色の髪を持ち、青髪にスイッチするために取得します。アナロジーは私が言ったようにふらふらになりますが、何が起こるかというと、misterStruct
老人は髪を変えるのではなく、外に出て青い髪の新しい人が入り、新しい人が自分を呼び始めますmisterStruct
。誰もアドレス変更通知を受け取る必要はありませんが、誰かがそのアドレスを見ると、青い髪の男が表示されます。
では、関数をで呼び出すとどうなるかをモデル化してみましょうstruct
。この場合、のようなmisterStruct
注文を取得するようなものchangeYourHairBlue()
です。したがって、郵便局はmisterStruct
「髪の毛を青くして、終わったら教えて」という指示を出します。
彼が以前と同じルーチンに従っている場合、変数が直接変更されたときに実行したことをしている場合、misterStruct
実行することは、自分の家から出て、青い髪の新しい人を呼び出すことです。しかし、それが問題です。
注文は「髪を青に変えて、いつ終わったか教えて」でしたが、その注文を受けたのは緑の男です。青い男が移動した後も、「ジョブ完了」通知を送信する必要があります。しかし、青い男はそれについて何も知りません。
[この類推を本当にひどく驚かせるために、技術的に緑髪の男に起こったことは、彼が引っ越した後、彼はすぐに自殺したということでした。だから、彼は、タスクが完了したことを誰に通知することができないのいずれか!]
この問題を回避するには、このような場合のみ、Swiftはその住所にある家に直接入り、現在の住民の髪を実際に変更する必要があります。これは、新しい人を送るだけのプロセスとはまったく異なります。
そして、それがSwiftがmutating
キーワードを使用することを望んでいる理由です!
最終結果は、構造体を参照する必要があるすべてのものと同じに見えます。家の住人は青い髪をしています。しかし、それを達成するためのプロセスは実際には完全に異なります。同じことをしているように見えますが、非常に異なることをしています。これは、Swiftの構造体が一般に実行しないことを実行しています。
したがって、貧弱なコンパイラに少し助けを与え、関数struct
がそれ自体でこれまでにすべてのstruct関数について mutationするかどうかを判断する必要がないようにするには、同情してmutating
キーワードを使用するように求められます。
本質的に、Swiftが迅速に滞在できるようにするには、私たち全員が自分の役割を果たす必要があります。:)
編集:
私に反対票を投じたねえ、デューデット、私は私の答えを完全に書き直しました。それがあなたとよりよく座っている場合、あなたは反対投票を削除しますか?