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

1

据我了解你的问题是对的。因此,演员的工作方式与您的示例中的子类相同。也许你错过了一些东西(提示在代码注释中):

// here the subclass SilentFilm
class SilentFilm:Movie {

}

// Here the array with SilentFilm objects
let someOtherObjects: [AnyObject] = [
    SilentFilm(name: "silentname", director: "silentdirector"),
    SilentFilm(name: "silentname2", director: "silentdirector2")
]

for object2 in someOtherObjects {
    // Here the cast to Movie like in your example
    let movie = object2 as! Movie
    // or cast to SilentFilm works also
    // let movie = object2 as! SilentFilm
    print("Movie: '\(movie.name)', dir. \(movie.director)")
}

// Expected Output
// Movie: 'silentname', dir. silentdirector
// Movie: 'silentname2', dir. silentdirector2

如果我误解了您的问题,请纠正我!

于 2016-03-08T17:58:03.220 回答
0

为什么不创建具有父Movie类的类层次结构并在遍历数组时检查电影的类型?如果AnyObject您指定数组包含Movie对象,并且所有子流派都继承自Movie.

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:太空漫游是一部电影

月亮是电影

外星人是一部电影

Caddyshack是一部喜剧

于 2016-03-08T18:11:20.700 回答