美文网首页
Swift中实现多态和进行类型转换

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

作者: 一个栗 | 来源:发表于2021-12-28 10:31 被阅读0次

类型

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# 中成为嵌套类。
  • 嵌套类型能够访问它外部的成员。

相关文章

网友评论

      本文标题:Swift中实现多态和进行类型转换

      本文链接:https://www.haomeiwen.com/subject/bmribltx.html