1. is关键字
A is B 返回一个布尔类型,表示A是否是B这种类型
//: Playground - noun: a place where people can play
import UIKit
class MediaItem{
var name: String
init(name: String){
self.name = name
}
}
class Movie: MediaItem{
var genre: String
init(name: String, genre: String){
self.genre = genre
super.init(name: name)
}
}
class Music: MediaItem{
var artist: String
init(name: String, artistName: String){
self.artist = artistName
super.init(name: name)
}
}
class Game: MediaItem{
var developer: String
init(name: String, developer: String){
self.developer = developer
super.init(name: name)
}
}
let library: [MediaItem] = [
Movie(name: "Zootopia", genre: "Animation"),
Music(name: "Hello", artistName: "Adele"),
Game(name: "LIMBO", developer: "Playdead"),
Music(name: "See you agian", artistName: "Wiz Khalifa"),
Game(name: "The Bridge", developer: "The Quantum Astrophysicists Guild")
]
var musicCount = 0
var movieCount = 0
var gameCount = 0
for mediaItem in library{
if mediaItem is Movie{
movieCount += 1
} else if mediaItem is Music{
musicCount += 1
} else if mediaItem is Game{
gameCount += 1
}
}
2. as关键字
as?返回的是一个可选型,需要解包,as!是强制解包。as主要用于类和类之间的转化
//: Playground - noun: a place where people can play
import UIKit
class MediaItem{
var name: String
init(name: String){
self.name = name
}
}
class Movie: MediaItem{
var genre: String
init(name: String, genre: String){
self.genre = genre
super.init(name: name)
}
}
class Music: MediaItem{
var artist: String
init(name: String, artistName: String){
self.artist = artistName
super.init(name: name)
}
}
class Game: MediaItem{
var developer: String
init(name: String, developer: String){
self.developer = developer
super.init(name: name)
}
}
let library: [MediaItem] = [
Movie(name: "Zootopia", genre: "Animation"),
Music(name: "Hello", artistName: "Adele"),
Game(name: "LIMBO", developer: "Playdead"),
Music(name: "See you agian", artistName: "Wiz Khalifa"),
Game(name: "The Bridge", developer: "The Quantum Astrophysicists Guild")
]
//let item0 = library[0] as? Movie
//let item0 = library[0] as? Music
//let item0 = library[0] as! Movie
//let item0 = library[0] as! Music
for mediaItem in library{
if let movie = mediaItem as? Movie{
print("Movie:", movie.name, "Genre:", movie.genre)
} else if let music = mediaItem as? Music{
print("Music:", music.name, "Artist:", music.artist)
} else if let game = mediaItem as? Game{
print("Game:", game.name, "Developer(s):", game.developer)
}
}
Ps:这里提一下一个专有名词,向下类型转换。
根据类的多态性,我们无需将子类显示的转化为父类的类型,这个是多态性自动做的,但是反过来,父类要转化成子类的类型就必须使用as关键字。
3. 利用is和as检查是否遵守协议关键字
其实和上面是一模一样的,有时候协议就可以充当一个父类。
//: Playground - noun: a place where people can play
import UIKit
protocol Shape{
var name: String{get}
}
protocol HasArea{
func area() -> Double
}
struct Point: Shape{
let name: String = "point"
var x: Double
var y: Double
}
struct Rectangle: Shape, HasArea{
let name: String = "rectangle"
var origin: Point
var width: Double
var height: Double
func area() -> Double{
return width * height
}
}
struct Circle: Shape, HasArea{
let name = "circle"
var center: Point
var radius: Double
func area() -> Double{
return Double.pi * radius * radius //swift 3
}
}
struct Line: Shape{
let name = "line"
var a: Point
var b: Point
}
let shapes:[Shape] = [
Rectangle(origin: Point(x:0.0,y:0.0), width: 3.0, height: 4.0),
Point(x: 0.0, y: 0.0),
Circle(center: Point(x:0.0,y:0.0), radius: 1.0),
Line(a: Point(x:1.0,y:1.0), b: Point(x:5.0,y:5.0))
]
for shape in shapes{
if shape is HasArea{
print("\(shape.name) has area.")
}
else{
print("\(shape.name) has no area.")
}
}
print("==========")
for shape in shapes{
if let areaShape = shape as? HasArea{
print("The area of \(shape.name) is \(areaShape.area()).")
}
else{
print("\(shape.name) has no area.")
}
}