値型は、変数や定数に代入されるとき、あるいは関数に渡されるときに、値がコピーされます。

実は、これまでの章のいたるところで値型を利用してきています。実のところ、Swift の基本的な型の整数、浮動小数点数、ブール、文字列、配列、辞書はすべて値型で、構造体として実装されています。

Swift での構造体と列挙型はすべて値型です。つまり、生成した構造体や列挙型のインスタンスと、プロパティにある値型は、渡されるときに常にコピーされます。

次の例は、前の例で見た構造体の Resolution を利用しています。

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd

この例では、フル HD 動画(幅 1920 ピクセル、高さ 1080 ピクセル)の幅と高さで初期化した Resolution のインスタンスを、定数 hd に設定する宣言です。

そして、変数 cinema を宣言し、hd の現在値を設定しています。Resolution は構造体であるため、インスタンスのコピーが作られ、この新しいコピーが cinema に代入されます。hdと cinema は同じ幅と高さを持ちますが、完全に別のインスタンスになります。

次に、cinema の width プロパティが、デジタルシネマプロジェクションで利用される少し広い 2K 標準(幅 2048 ピクセル、高さ 1080 ピクセル)の幅に修正されています。

cinema.width = 2048

cinema の width プロパティが実際に 2048 に変更されていることを確認します。

print("cinema is now \(cinema.width) pixels wide")
// "cinema is now 2048 pixels wide" と出力

ですが、もとの hd インスタンスの width プロパティは、古い値 1920 のままです。

print("hd is still \(hd.width) pixels wide")
// "hd is still 1920 pixels wide" と出力

cinema に hd の現在値を与えたとき、hd の値が新しい cinema インスタンスにコピーされます。結果、完全に別のインスタンスとなり、単に同じ数値を持っているということになります。これらは別のインスタンスであるため、cinema の幅に設定した 2048 は、hd の幅に影響を与えません。

列挙型にも同じ動作が適用されます。

enum CompassPoint {
    case North, South, East, West
}
var currentDirection = CompassPoint.West
let rememberedDirection = currentDirection
currentDirection = .East
if rememberedDirection == .West {
    print("The remembered direction is still .West")
}
// "The remembered direction is still .West" と出力

rememberedDirection が currentDirection の値に代入されるとき、実際にはその値のコピーが設定されています。currentDirection の値の変更は、rememberedDirection にあるもとの値のコピーには影響しません。


Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.