Swiftは初めから値型、すなわちデータモデリングの主要手段として構造体(struct)に重点を置いています。Objective-Cではすべてがオブジェクト(クラス)でしたが、Swiftは単純なモデル、データ、小規模なビジネスオブジェクトに対して構造体の使用を奨励します。
多くの開発者、特に他のオブジェクト指向言語の経験がある人々は、すべてにクラスを使用してしまう誤解をしています。これはメモリの問題(参照サイクル)、オブジェクトを渡した際の予期しない変更、スレッドの安全性の問題を引き起こします。クラスは参照型だからです。
Swiftでは構造体は値型であり、代入や関数への渡しの際にコピーされますが、クラス(参照型)は参照を渡します。これが、複雑なライフサイクルや継承のロジックがないモデルには構造体が好まれる理由です。
コードの例:
struct Point { var x: Int var y: Int } var p1 = Point(x: 10, y: 20) var p2 = p1 p2.x = 30 // p1.xは10のままです
主な特徴:
構造体には継承者(サブクラス)を持てますか?
いいえ、Swiftの構造体は継承をサポートしていません。全ての振る舞いの拡張はプロトコルとエクステンションを通じてのみ可能です。
構造体は関数に渡す際に常にコピーされるということですか?
実際には、Swiftはコピーオンライト最適化を使用します。構造体を変更しない限り、それはコピーされず、変更時にのみコピーが作成されます。これは標準コレクションや複雑な構造体に関わります。
var arr1 = [1, 2, 3] var arr2 = arr1 arr2.append(4) // ここでのみコピーが発生します
どのような場合に構造体を使用できないのか?
同種のデータを保持するためにクラスを使用した結果、メモリへの頻繁なアクセスによるパフォーマンスの低下、複雑なメモリ管理、参照の混乱に関するバグが発生しました。
長所:
短所:
データモデルに対して構造体を使用し、安全にコピーされ、リークがなく、余分な複雑さがないこと。
長所:
短所: