import UIKit
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)
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//類型轉換
//類型轉換可以判斷實例的類型,也可以將實例看作是父類或者子類的實例
//swift 中使用is 和as 操作符實現。這兩個操作符提供了一種簡單答意的方式去檢查值的類型
let library=[
Movie(name: "Case", director: "Mich"),
Song(name: "Blue", artist: "Elvis"),
Movie(name: "Citizen", director: "Orson"),
Song(name: "The One", artist: "Chesney"),
Song(name: "Never", artist: "Rick")
]//在幕後library裏存儲的媒體項依然是Movie和Song類型。但是若迭代它,依次取出的實例會是MediaItem類型。
//用類型檢查操作符(is)來檢查一個實例是否屬於特定子類型。若實例屬於那個子類型,類型檢查操作符返回true,否則返回false
var movieCount = 0
var songCount = 0
for item in library{
if item is Movie{
++movieCount
}else if item is Song{
++songCount
}
}
print("Media library contains \(movieCount) and \(songCount) songs") //Media library contains 2 and 3 songs
//向下轉型
//某類型的一個常量或變量可能在幕後實際上屬於一個子類。當確定是這種情況時,你可以嘗試向下轉到他的子類型,用類型轉換操作符(as? 或 as!)
//條件形式as? 返回一個你試圖向下轉成的類型的可選值。強制形式as!把試圖向下轉型和強制解包結果作爲一個混合動作。
//當你不確定向下轉型可以成功時,用類型轉換的條件形式 as?
//當你可以確定向下轉型一定會成功時,才使用強制形式 as!
for item in library{
if let movie=item as? Movie{
print("Move:\(movie.name) \(movie.director)")
}else if let song = item as? Song{
print("Song:\(song.name) \(song.artist)")
}
}
// Move:Case Mich
// Song:Blue Elvis
// Move:Citizen Orson
// Song:The One Chesney
// Song:Never Rick
//Any和AnyObject的類型轉換
//swift爲不確定類型提供了兩種特殊類型別名
//AnyObject 可以代表任何class類型的實例
//Any可以表示任何類型,包括方法類型
let someObjects:[AnyObject]=[
Movie(name: "2001", director: "StanleyKubrick"),
Movie(name: "Moon", director: "Duncan Jones"),
Movie(name: "Alien", director: "Ridley Scott")
]
//因爲知道這個數組只包含Movie實例,可以直接用as!下轉並解包到不可選的Movie類型
for object in someObjects{
let movie = object as! Movie
print("Movie:\(movie.name) \(movie.director)")
}
// Movie:2001 StanleyKubrick
// Movie:Moon Duncan Jones
// Movie:Alien Ridley Scott
for movie in someObjects as! [Movie]{
print("Movie:\(movie.name) \(movie.director)")
}//下轉someObjects數組爲[Movie]類型來代替下轉數組中的每一項
//Any類型
//使用Any類型來和混合的不同類型一起工作,包括方法類型和非class類型。
var things = [Any]()
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.1459)
things.append("hello")
things.append((3.0,5.0))
things.append(Movie(name: "DLG", director: "GOD"))
things.append({(name:String) -> String in return "hello,\(name)"})
for mything in things{
switch mything{
case 0 as Int:
print("zero as an int")
case 0 as Double:
print("zero as a Double")
case let someInt as Int:
print("An integer value of \(someInt)")
case let someDouble as Double where someDouble > 0:
print("a positive double value of \(someDouble)")
case is Double:
print("some other double value that I do not want to print")
case let someString as String:
print("a string value of \(someString)")
case let (x, y) as (Double,Double):
print("an (x,y)point at \(x),\(y)")
case let movie as Movie:
print("a movie called '\(movie.name)', \(movie.director)")
case let stringConverter as String->String:
print(stringConverter("DLG"))
default:
print("something else")
}
}
// zero as an int
// zero as a Double
// An integer value of 42
// a positive double value of 3.1459
// a string value of hello
// an (x,y)point at 3.0,5.0
// a movie called 'DLG', GOD
// hello,DLG
}
}