Contents
はじめに
Swift を学習していて Struct と Class の違いや使い分けでつまずいたので調べたことをまとめていきます。
以下のバージョンで実行しています。
Xcode: Version 13.2.1 (13C100)
Swift: 5.5.2
結論
最初に結論からお伝えします。
-
- Struct は値型、Class は参照型である。
-
- どちらもプロパティ、メソッド、イニシャライザがある。
-
- class には継承、デイニシャライザがある。
-
- 使い分けはインスタンスがどのような情報を扱うかで考える。
では、具体的な内容について書いていきたいと思います。
Struct とは
Swift の基本的な型(数値、文字列、配列、辞書)は Struct で定義されています。
Struct は値型のため、インスタンスが引数として渡される場合は値そのもの(=インスタンスのコピー)が渡されます。
インスタンスのコピーが代入されるため、kuroで値(コピーした値)を変更してもtamaの値(元の値)が変更されることはありません。
COW(Copy On Write)
Swift の値型にはCopy On Writeという機能が導入されています。
代入の際に即座にコピーが行われるわけではなく、代入先で変更が生じたときに初めてコピーが行われます。
Class とは
Class は参照型であり、インスタンスが引数として渡される場合は値の参照が渡されます。
kuroの値を変更するとtamaの値も変更されます。
値型とは違い、tamaとkuroごとに値を保持せずに、共通の値を参照しているためです。
継承
class には Struct にはない継承という機能があります。
継承については今後別記事で記載予定です。
デイニシャライザ
Swiftは Class のメモリ管理にARC(Automatic Reference Counting)という仕組みを利用しています。
インスタンスへの参照がいくつあるかをカウントし、参照がなくなったタイミングでインスタンスのために確保されたメモリが開放されます。
インスタンスが破棄されるタイミングでデイニシャライザが実行されます。
使い分け
Appleの公式ドキュメントでは基本的にはStructを使うことを検討するように記載されています。
以下のように最新の状態が共有されるような場合はClassが望ましいとされています。
まとめ
この記事ではStructとClassの違いについてまとめてみました。
-
- Struct は値型、Class は参照型である。
-
- どちらもプロパティ、メソッド、イニシャライザがある。
-
- class には継承、デイニシャライザがある。
-
- 使い分けはインスタンスがどのような情報を扱うかで考える。
私の理解が甘く、間違った情報を記載している部分があるかもしれません。
誤りなどありましたらご指摘いただけましたら幸いです。
参考資料
Swift 実践入門 増補改訂第 3 版
https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID82
https://developer.apple.com/documentation/swift/choosing_between_Structures_and_classes
https://software.small-desk.com/development/2021/05/10/which-should-be-used-Struct-or-class/
https://cockscomb.hatenablog.com/entry/choosing-between-classes-and-structures
https://qiita.com/lovee/items/0bf5e663dd74983cc0d3
https://speakerdeck.com/lovee/jin-geng-wen-kenai-struct-to-class-falseshi-ifen-kefang
https://qiita.com/Howasuto/items/57acf33b40dbf4604397
https://yamatooo.blog/entry/2020/11/06/083000
https://qiita.com/koher/items/bcdbf6578b6edd1f9e0c
https://swift-ios.keicode.com/lang/deinitializer.php