公開中のアプリ

[Swift入門#28]クラス(構造体(struct)編)

今回は構造体(struct)について書きたいと思います。
構造体(struct)の説明から実際の使用例までサンプルコードをもとにわかりやすく説明していきたいと思います。

構造体(struct)とは

構造体(struct)は機能や役割的にはクラスとほとんど同じです。
違いとしては、2つあります。
①構造体は参照型ではなく値型になります。
②構造体は継承(override)できない。

構造体(struct)を書いてみよう

structキーワードを使おう

構造体でもクラスと同じようにプロパティやメソッド、イニシャライザを使えます。
書き方はclassではなくstructと書いてあげればOKです!

まずが構造体が参照型ではなく値型になると言う部分を見ていきたいと思います。

サンプルは前回の[Swift入門#25]クラス(値型と参照型編)と同じサンプルを用意しました。

struct Staff {
    var name: String
    init(_ name: String) {
        self.name = name
    }
}

var mayugezio = Staff("まゆげじお")
var copy = mayugezio // クラスと違って値そのものが格納されている。
mayugezio.name = "げじお"
print(mayugezio.name) // 結果 "げじお"
print(copy.name) // 結果 "まゆげじおげじお" ※クラスの時とは結果が違う!

上記コードの変更点は、1行目のclassをstructに変更しただけですが、先ほども言った通り構造体は参照型ではなく値型になるので、12行目の結果がクラスの時とは違います。

クラスは参照型なので、12行目の結果は「げじお」になりますが、構造体は値型なので12行目の結果が「まゆげじお」になっていますね。

構造体は基本的に一回作ったら値を変更して欲しくない時に使います。
その為、メソッドからプロパティの値を変更する事ができません。

mutatingキーワードを使おう

構造体のプロパティの値をメソッドから変更するにはmutatingをキーワードを使うだけでOKです!
今回はmayugezioの「nameプロパティ」を大文字に変更するメソッドを追加しました。

struct Staff {
    var name: String
    init(_ name: String) {
        self.name = name
    }
    mutating func oomozi() {
        self.name = name.uppercased()
        print(self.name)
    }
}

var mayugezio = Staff("mayugezio")
mayugezio.oomozi()// 結果 MAYUGEZIO

6行目〜9行目がメソッドの部分です。
funcの前にmutatingとなっているのがわかると思います。
構造体のプロパティの値をメソッドで変更する場合はこのmutatingキーワードを使う事を覚えておきましょう!

※7行目で「nameプロパティ」を大文字に変換しています。

構造体は継承(override)できない

構造体は継承(override)できません!
ですがprotocolやextensionは使えるので機能を拡張する場合はそちらを使いましょう!!

まとめ

今回は構造体についての説明しました。
注意点としては
①構造体は参照型ではなく値型になります。
②構造体は継承(override)できないが、protocolやextensionは使える。
③プロパティの値をメソッドで変更する場合はmutatingキーワードを使おう。

この3つをおさえておきましょう!!

コメントを残す

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

アプリ