Swift 入門 | 構造体、列挙型、タプル | 構造体

Swift には、クラスや配列のほかにも複雑な性質を持つ値がある。まず構造体について説明する。

構造体は、値を保存するプロパティと処理を実装するメソッドを持つ。構造体を使うには、最初に定義を記述し、それを基にインスタンスを作成する。クラスと同じように見えるかもしれない。

基本的な構造とプロパティやメソッドの扱いはクラスとほぼ同じだが、重要な違いがある。

struct を使った定義

クラスは class 名前 と記述するが、構造体は struct 名前 と記述する。プロパティとメソッドの書き方はクラスと同じである。

struct 名前 {
    ... プロパティとメソッドを記述する ...
}

継承できない

構造体には、クラスのようなオブジェクト指向の継承機能がない。値と処理を 1 つにまとめるためのものであり、継承して新しい構造体を作ることはできない。

イニシャライザーが不要

プロパティを持つ構造体では、各プロパティの値を引数として受け取るイニシャライザーが自動的に生成される。

値がコピーされる

これは重要な違いである。クラスのインスタンスは変数から参照される。その変数を別の変数に代入すると参照がコピーされ、両方の変数が同じインスタンスを参照する。

構造体ではこのような参照を使わない。構造体のインスタンスを別の変数に代入すると構造体自体がコピーされ、2 つの変数は別々のインスタンスを持つ。

struct MyData {
    var age:Int
    var name:String

    func getData() ->String {
        return "[\(name)(\(age))]"
    }
}

var data = MyData(age: 99, name: "Taro")
var data2 = data
data2.name = "Hanako"
data2.age = 24
println(data.getData())
println(data2.getData())

このコードでは MyData 構造体を定義し、インスタンスを作成している。MyData(age: 99, name: "Taro") で使用するイニシャライザーは、Swift が自動的に提供する。

data をそのまま data2 に代入しているが、プロパティを変更して出力すると、それぞれが別のインスタンスを持つことを確認できる。