Swift:型別轉換專題
阿新 • • 發佈:2018-12-12
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.") } }