2

Apple は、同じ型のオブジェクトをダウンキャストする例を示しています。

let someObjects: [AnyObject] = [
    Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"),
    Movie(name: "Moon", director: "Duncan Jones"),
    Movie(name: "Alien", director: "Ridley Scott")
]

次に、抽象変数「オブジェクト」を作成し、期待どおりにキャストすることで、個々の属性にアクセスできます (ムービー) :

for object in someObjects {
    let movie = object as! Movie
    print("Movie: '\(movie.name)', dir. \(movie.director)")
}

しかし、次のレベルに進んで、たとえば映画のサブクラスがあるとしたらどうなるでしょうか。

無声映画

コメディ

アクション

それぞれが同じ属性 (名前と監督) を持っています。

親クラスとしてそのサブクラスを認識できると想定したため、上記と同じ方法で「ムービー」としてキャストしようとしましたが、もちろんこれは機能しませんでした。そうでなければ、この質問は存在しなかったでしょう!

4

2 に答える 2

0

親クラスを使用してクラス階層を作成しMovie、配列を反復処理しながらムービーのタイプを確認してみませんか? 配列にオブジェクトが含まれていることを指定し、すべてのサブジャンルが から継承されるAnyObjectように指定する場合、強制的にキャストする必要はありません。MovieMovie

class Movie {
    var name: String!
    var director: String!
    
    init(name: String, director: String) {
        self.name = name
        self.director = director
    }
}

class Comedy: Movie {
    var laughTrack: Bool!
    
    init(name: String, director: String, laughTrack: Bool) {
        super.init(name: name, director: director)
        self.laughTrack = laughTrack
    }
}

let someObjects: [Movie] = [
    Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"),
    Movie(name: "Moon", director: "Duncan Jones"),
    Movie(name: "Alien", director: "Ridley Scott"),
    Comedy(name: "Caddyshack", director: "Harold Ramis", laughTrack: false)
]

for movie in someObjects {
    if movie is Comedy {
        print("\(movie.name) is a comedy")
    } else {
        print("\(movie.name) is a movie")
    }
}

出力:

2001年宇宙の旅は映画です

月は映画

エイリアンは映画

キャディーシャックはコメディ

于 2016-03-08T18:11:20.700 に答える