2014年6月4日水曜日

Swift言語の入門 (5) 構造体編

Swift言語の構造体は、C言語の構造体からパワーアップし、クラスとも異なる新しい機構へと変化しました。クラスと少々紛らわしいですが、大きな違いは変数へ代入するときの挙動で、クラスは参照渡し、構造体は値渡しです。その特徴も相まって、一度作った構造体の値を変更する関数を書くときには、mutating修飾子を指定しなければならない等、今までに無かったルールが定められています。

1.宣言

  • struct Point {
  • var x: Double
  • var y: Double
  • func norm() -> Double {
  • return norm(x * x + y * y)
  • }
  • }

C言語の構造体とは異なり、メソッドも定義できるようになりました。これでわざわざ第一引数に構造体をとって何かするような関数を大量に生成する必要がなくなりました。

2.初期化

var p = Point(x:1, y:2);

構造体を実際に利用するには、上記のような書き方をします。メンバーの名前とコロンと値をカンマで繋げていく方式です。newなどのキーワードは特にありません。

現状このPoint構造体には、フィールドの初期値が指定されていないため、引数無しでPointを作ろうとするとエラーになります。しかしながら、構造体の宣言の際に、各フィールドに初期値をあたえておけば、引数無しでも初期値を使って構造体を初期化することが可能です。

3.フィールドへのアクセス

フィールドへのアクセスは通常通り、ドット演算子を用いて行います。

println(p.x);

また、フィールドへの代入も同様です。

p.x = 10;

構造体が値渡しである証拠に、一度別の変数に代入してしまうと、その後元の変数が書き換えられても、代入先には影響を及ぼしません。

var p = Point(x:1, y:2);
var q = p;
p.x = 10;

println("p.x = \(p.x), q.x = \(q.x)") //p.x = 10.0, q.x = 1.0


4.mutating

構造体の値を書き換える関数を書くときには、mutating修飾子をつける必要があります。
例えば、Point構造体の位置をY軸にそって反転させるflipY関数を例にとります。

func flipY() {
    x = -x //この = でエラー

}

このままではエラーが表示され、コンパイルできません。なので、funcの前のmutating修飾子をつけて再度コンパイルをします。

mutating func flipY() {
    x = -x

}

総括
  • 構造体は値渡し
  • 関数も持てる
  • 構造体を書き換える関数にはmutating修飾子
Swift関連記事