1. ホーム
  2. swift

[解決済み] SwiftはPass By ValueかPass By Referenceか

2022-03-06 03:07:47

質問

私はSwiftの初心者なのですが、クラスは参照渡しで、配列や文字列などはコピーされると読みました。

Objective-CやJavaのように、実際に参照を渡すのか、それとも参照渡しとなるのか、どちらでしょうか?

どのように解決するのですか?

SwiftのThingsの種類

というルールがあります。

  • クラスインスタンスは 参照型 (すなわち あなたの クラスインスタンスへの参照は、事実上 ポインタ )

  • 関数は参照型

  • それ以外はすべて 値型 他のすべてとは、単に構造体のインスタンスと列挙型のインスタンスを意味し、それがSwiftにあるすべてだからです。配列と文字列は、例えば、構造体のインスタンスです。あなたは できる を使用して、それらのものへの参照を(関数の引数として)渡します。 inout で、newacctさんが指摘されているように、アドレスを取ります。しかし、この型はそれ自体が値型である。

参照型が意味するもの

参照型オブジェクトは、実際には特別なものです。

  • 単なる代入や関数への引き渡しで、同じオブジェクトへの複数の参照を得ることができる。

  • オブジェクトへの参照が定数であっても、オブジェクト自体は変更可能である ( let 明示的または暗示的に)。

  • オブジェクトへの変異は、そのオブジェクトへのすべての参照から見て、そのオブジェクトに影響を与える。

それらは危険なものである可能性があるので、気をつけましょう。一方、参照型を渡すと、ポインタだけがコピーされて渡されるので、明らかに効率的であり、些細なことです。

値域型が意味するもの

明らかに、値型を渡す方が "安全"であり、また let 構造体インスタンスやenumインスタンスを let を参照します。一方、その安全性は、値のコピーを別に作ることで実現されていますよね?そうすると、値の型を渡すのが高くつく可能性があるのでは?

まあ、イエスでもありノーでもありますね。あなたが考えているほど悪いことではありません。Nate Cookが言っているように、値型を渡すことは 必ずしも はコピーを意味する。 let (明示的または暗示的に)不変性が保証されているので、何かをコピーする必要はない。また var を参照したからといって する コピーされるだけで できる 必要であれば(突然変異があるため)可能です。ドキュメントでは、特に、些細なことにこだわらないようにと忠告しています。