
今回は値型と参照型について書きたいと思います。
値型と参照型の説明から実際の使用例までサンプルコードをもとにわかりやすく説明していきたいと思います。
Swiftではデータの型が大きく2種類に分けられています。
IntやString、配列などは「値型」に分類されます。
対してクラスだけが「参照型」になります。
「値型」と「参照型」の違いは変数や引数に渡される時の挙動が違います。
詳しい説明はサンプルをもとに説明していきます。
ではまず値型の時、変数がどう渡されているか改めて確認して見ましょう!
var num1 = 10
var num2 = num1 //num1の値そのものが格納されている。
num1 = 20
print(num1)//結果 20
print(num2)//結果 10
上記コードを見ながら変数の挙動を確認してみましょう!
まず流れを簡単に説明します。
1行目「変数num1」に10を代入
2行目「変数num2」に「変数num1」を代入
3行目「変数num1」に20を代入
4行目「変数num1」をprint()
5行目「変数num2」をprint()
注意して欲しいのは2行目です。
「変数num2」に代入されるのは「変数num1」の値そのものと言う事です。
なので3行目で「変数num1」の値を変更しても5行目の「変数num2」の結果には影響しないと言う事を覚えておいて下さい。
値型は普段から使い慣れていると思うので今更何を言ってるんだって思うかもしれませんが、参照型は少し違う挙動をします。
次は参照型の挙動について見てみましょう。
class Staff {
var name: String
init(_ name: String) {
self.name = name
}
}
var mayugezio = Staff("まゆげじお") //インスタンス
var copy = mayugezio // mayugezioが格納されている場所
mayugezio.name = "げじお"
print(mayugezio.name) //"げじお"
print(copy.name) //"げじお"
まず流れを簡単に説明します。
「nameプロパティ」を持った「Staffクラス」があり、8行目でインスタンスを生成しています。
9行目 「変数copy」に「変数mayugezio」を代入している。
10行目 「変数mayugezio」の「nameプロパティ」を「げじお」に変更しています。
11行目 「変数mayugezio」の「nameプロパティ」を出力
12行目 「変数copy」の「nameプロパティ」を出力
流れとしては値型のサンプルと同じ事をしているのがわかると思います。
ただ11行目と12行目の結果が違う事に注目しましょう。
これはなぜかと言うと、参照型ではデータが格納されている場所が代入されているからです。
値型は値そのもの、参照型はデーダ格納されている場所が代入されると言う事ですね。
参照型の場合は、今回の例でわかるように、もとのデータを変更したらコピーした方のデータも変更されてしまうと言う事に注意しておきましょう!!
今回は値型と参照型の違いについて書いてみました。
要するに、値型は値そのものが代入されて、
参照型はデータが格納されている場所 が代入されると言う事を覚えておけばOKですね!
ありがとうございました!
[…] 構造体でもクラスと同じようにプロパティやメソッド、イニシャライザを使えます。書き方はclassではなくstructと書いてあげればOKです!まずが構造体が参照型ではなく値型になると言う部分を見ていきたいと思います。サンプルは前回の[Swift入門#25]クラス(値型と参照型編)と同じサンプルを用意しました。 […]