値型は、変数や定数に代入されるとき、あるいは関数に渡されるときに、値がコピーされます。
実は、これまでの章のいたるところで値型を利用してきています。実のところ、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.