2016-03-08 48 views
1

苹果给了我们向下转换相同类型的对象作为这样的一个例子:如何向下转换可以是多种类型的对象?

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)") 
} 

但是,如果我们去到一个新的水平,并举例来说,我们有电影的子类的内容:

无声电影

喜剧

行动

其中每一种都具有相同的属性 - 命名&主任

我试着投它我们上面那样的“电影”,因为我假定以同样的方式一个父类,它将能够识别它的子类,但当然这不起作用,否则这个问题就不存在了!

+0

你可以显示代码,你是如何试图以相同的方式投下子类的? – ronatory

+0

我无法重现您的问题。当我尝试它时它工作正常(不是这是个好主意,你不应该经常需要'AnyObject',并且如果你能避免它们,你通常应该避免使用子类和向下转换。)作为罗恩笔记,你应该显示*不工作的代码,而不仅仅是*的代码*。 –

+0

不要忘记回来接受答案或投票答案,帮助你。 – JAL

回答

0

因为我理解你的问题的权利。因此,演员的工作方式与您的示例中的子类相同。也许你遗漏了一些东西(提示在代码注释中):

// 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 

如果我错误地理解了你的问题,请纠正我!

0

为什么不用父类Movie类创建类层次结构,并在遍历数组的同时检查电影的类型?如果您指定阵列包含Movie对象,并且让所有子类型都继承自Movie,则无需从AnyObject强制施放。

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:太空奥德赛电影

月亮是一个电影

外国人是电影

小小球童是喜剧

相关问题