Swift:类型转换专题

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

 

猜你喜欢

转载自blog.csdn.net/shijie97/article/details/84543137
今日推荐