Swift中实现多态和进行类型转换

类型

class MediaItem {
    var name: String
    init(name: String) {
        self.name = name
    }
}

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

let library = [
    Movie(name: "111", director: "222"),
    Song(name: "333", artist: "444"),
    Movie(name: "555", director: "666"),
    Song(name: "777", artist: "888"),
    Song(name: "999", artist: "000"),
]
print(type(of: library))

let movie = [
    Movie(name: "111", director: "222"),
    Movie(name: "555", director: "666"),
]
print(type(of: movie))

let song = [
    Song(name: "333", artist: "444"),
    Song(name: "777", artist: "888"),
    Song(name: "999", artist: "000"),
]
print(type(of: song))

执行结果如下:
Array<MediaItem>
Array<Movie>
Array<Song>

类型检查

  • 使用类型检查操作符(is)来检查一个实例是否属于一个特定的子类。如果实例是该子类类型,类型检查操作符返回 true,否则返回 false。

向下类型转换

  • 某个类类型的常量或变量可能实际上在后台引用自一个子类的实例。当你遇到这种情况时你可以尝试使用类型转换操作符(as? 或 as!)将它向下类型转换至其子类类型。
  • 由于向下类型转换可能失败,类型转换操作符就有了两个不同形式。条件形式 as? 返回了一个你将要向下类型转换的值的可选项。强制形式,as! 则向下类型转换和强制展开结合为一个步骤。

Any 和 AnyObject

  • Swift 为不确定的类型提供了两种特殊的类型别名:
  • AnyObject 可以表示任何类类型的实例。
  • Any 可以表示任何类型,包括函数类型。
let library = [
    Movie(name: "111", director: "222"),
    Song(name: "333", artist: "444"),
    Movie(name: "555", director: "666"),
    Song(name: "777", artist: "888"),
    Song(name: "999", artist: "000"),
]

for item in library {
    if let realItem = item as? Movie {
        print(realItem.director)
    }
}

执行结果如下:
222
666

嵌套类型

  • Swift 中的类,结构体和枚举可以进行嵌套,即在同一类型的内部定义类型,这种类型嵌套在 java 中称为内部类,在 C# 中成为嵌套类。
  • 嵌套类型能够访问它外部的成员。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容