Swift class と struct の違い/使い分け

Swiftでは、class(クラス)とstruct(構造体)の2つがよく似た機能を持つため
どちらを使うべきなのか悩む場面があります。
この2つの違い、そしてどのように使い分けたらいいのかを纏めてみます。

2つの違い

まず、大きな違いは以下の2点です。

classは参照渡し、structは値渡し

class MyClass {
    var a: Int
    init(value: Int) {
        a = value
    }
}
struct MyStruct {
    var a: Int
    init(value: Int) {
        a = value
    }
}
let myClassA = MyClass(value: 10)
var myClassB = myClassA
myClassB.a = 20
// myClassA.a = 20, myClassB.a = 20

let myStructA = MyStruct(value: 10)
var myStructB = myStructA
myStructB.a = 20
// myStructA.a = 10, myStructB.a = 20

classは継承できる、structは継承できない

// OK
class NewMyClass: MyClass {
}

// NG
struct NewMyStruct: MyStruct {
}

他にもいくつか細かい違い(classではできるがstructではできないこと)がありますが、
classとstructどちらを選ぶかという時には主に上記2点が比較対象となるかと思います。

どのように使い分けたらいいのか

こうして見ると、参照渡しと値渡しの違い以外はclassだけで出来ることばっかり・・・
じゃあ値渡しが必要な時はstructを使って、それ以外はclassを使えばいいじゃん?
その疑問に対する、Appleの回答は以下です。

The Swift Programming Language – Choosing Between Classes and Structures

一般的なガイドラインとして、これらの条件に1つ以上当てはまる際に構造体を選択することを検討してください。
・いくつかの比較的単純な値のカプセル化が目的である
・カプセル化された値を参照ではなくコピーしたい時
・カプセル化された値に保存されているプロパティについても参照ではなくコピーされるべき時
・別の型からプロパティや動作を継承する必要がない時

やっぱり似たようなことが書いてある・・・。
そして更に

これらの条件に当てはまらない時はクラスを選択するべきです。

と、トドメの一撃が。

では実際にAppleはどのような時にstructを使っているのかというと、String,Int,Double等のデータ型はstructで作成されています。
やはりこういった、1つ又は少数のデータを保持する目的のものはstructで作成するといいのかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>