特定のクラスインスタンスの型をチェックする、あるいはそのインスタンスを同じ階層内の別のクラスにキャストするために、クラスとサブクラスの階層で型キャストを使用することができます。型キャストの例で使用するために、以降のコードでクラスの階層と、それらのクラスのインスタンスを含む配列を定義しています。
はじめのコードでは、新しいベースクラス MediaItem
を定義しています。このクラスは、デジタルメディアライブラリに表示されるあらゆる種類のアイテムのための基本的な機能を持っています。具体的には、String
型の name
プロパティと、init name
イニシャライザを宣言しています。(すべての映画と音楽を含め、メディアアイテムのすべてに名前があるものと仮定しています。)
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
次のコードでは、MediaItem
のサブクラスを 2 つ定義しています。1 つ目のサブクラス Movie
には、映画についての付加情報があります。ベースの MediaItem
クラスに加え、director
プロパティとそれに対応するイニシャライザを追加しています。2 つ目のサブクラス Song
には、ベースクラスに加えて artist
プロパティとイニシャライザを追加しています。
class Movie: MediaItem {
var director: String
init(name: String, director: String) {
self.director = director
super.init(name: name)
}
}
class Song: MediaItem {
var artist: String
init(name: String, artist: String) {
self.artist = artist
super.init(name: name)
}
}
最後のコードでは、2 つの Movie
インスタンスと 3 つの Song
インスタンスを含む、定数の配列 library
を生成しています。配列 library
の型は、初期化時の配列リテラルの内容で推論されます。Swift の型チェッカーは、Movie
と Song
に共通するスーパークラス MediaItem
があると推定することができるため、配列 library
を [MediaItem]
型と推論します。
let library = [
Movie(name: "Casablanca", director: "Michael Curtiz"),
Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),
Movie(name: "Citizen Kane", director: "Orson Welles"),
Song(name: "The One And Only", artist: "Chesney Hawkes"),
Song(name: "Never Gonna Give You Up", artist: "Rick Astley")
]
// "library" の型を [MediaItem] と推論
library
に保管されているアイテムは、依然として Movie
と Song
のインスタンスです。しかしながら、この配列の内容を繰り返し処理する場合、受け取るアイテムは Movie
や Song
としてではなく、MediaItem
型としてになります。固有の型として扱うためには、型をチェックする、あるいは異なる型にダウンキャストする必要があります。
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.