特定のクラスインスタンスの型をチェックする、あるいはそのインスタンスを同じ階層内の別のクラスにキャストするために、クラスとサブクラスの階層で型キャストを使用することができます。型キャストの例で使用するために、以降のコードでクラスの階層と、それらのクラスのインスタンスを含む配列を定義しています。

はじめのコードでは、新しいベースクラス 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.