Swiftに特徴的なタイプシステム:値型、参照型
Swiftは殆どのオブジェクト指向言語と同じくオブジェクト毎に型(Type)がある。
それとはまた違ったType Systemがある。それが値型(Value type)と参照型(Reference type)である。
この二つは通常の言語における「型」より一段上の概念である。たとえば整数を扱うInt型は値型と決まっているし、クラスから継承されたオブジェクトは参照型と決まっている。
Swift上のオブジェクトはそのどちらかであり、そのオブジェクトが何を材料として構成されているかによって決まる。その材料は次の二つである。
- Structure, Enumerationは値型
- Class, Closureは参照型
つまりそのオブジェクトStructureやEnumerationで定義されていれば値型のオブジェクトになり、ClassやClosureで定義されていれば参照型のオブジェクトになるというわけである。
この違いはパフォーマンスに大きな影響を与えるので、Swiftでなんらかのプロジェクトを作成しようとする場合にはしっかりとマスターしなければならない。
結論から先に言えば、「できるだけ値型のオブジェクト利用を心がけよ」ということである。
公式開発者ドキュメントApple Developer Documentationの中にある記事Choosing Between Structures and Classesにもできる限り参照型のClassより値型のStructureを用いよと書かれてある。
多くのSwiftのサンプルプログラムでは未だに(ほとんどが参照型の)NS系のオブジェクトを用いているが、Swift標準ライブラリ内などに同等の値型のものがないかまず調べることが大切である。