類型轉換

  1. 類型判斷操作符
    1. ==,!=判斷倆個值類型是否相等
    2. ===,!==判斷兩個引用是否是一個內存地址
    3. is判斷某個對象是否是某個類型
class MediaItem {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class Movie: MediaItem {
    var director: String
    init(director: String, name:String) {
        self.director = director
        super.init(name: name)
    }
}

class Song: MediaItem {
    var artist: String
    init(artist: String, name: String) {
        self.artist = artist
        super.init(name: name)
    }
}

//library被推斷出來存儲的類型是MediaItem類型,所以遍歷時候取出來的每一個item類型默認都是MediaItem類型
let library = [
    Movie(director: "1", name: "1"),
    Song(artist: "2", name: "2"),
    Song(artist: "3", name: "3"),
    Movie(director: "4", name: "4"),
    Song(artist: "5", name: "5"),
]

var movieCount = 0, songCount = 0
for  item in library {
    //item是MediaItem類型
    if item is Movie {
        movieCount += 1
    }else if item is Song{
        songCount += 1
    }
}
print("moveCount = \(movieCount)   songCount = \(songCount)")
  1. 向下轉型
    1. 當不確定轉型是否會是確定的子類類型時候要用as?
    2. 當確定轉型會是確定的子類類型時候要用as!
    3. 向上轉型總是會成功,沒有意義的!沒有關聯的對象轉型總是會失敗,也是沒意義的。所以只是存在向下轉型。轉成更加確定的類型。
class MediaItem {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class Movie: MediaItem {
    var director: String
    init(director: String, name:String) {
        self.director = director
        super.init(name: name)
    }
}

class Song: MediaItem {
    var artist: String
    init(artist: String, name: String) {
        self.artist = artist
        super.init(name: name)
    }
}

//library被推斷出來存儲的類型是MediaItem類型,所以遍歷時候取出來的每一個item類型默認都是MediaItem類型
let library = [
    Movie(director: "1", name: "1"),
    Song(artist: "2", name: "2"),
    Song(artist: "3", name: "3"),
    Movie(director: "4", name: "4"),
    Song(artist: "5", name: "5"),
]

var movieCount = 0
var songCount = 0
for item in library {
    //item默認是MediaItem類型
    if let _ = item as? Movie{
        movieCount += 1
    } else if let _ = item as? Song{
        songCount += 1
    }
}

print("movieCount = \(movieCount)   songCount = \(songCount)")
  1. Any與AnyObject區別

    1. AnyObject是Any的子類
    2. AnyObject只是表示對象類型
    3. Any可以表示所有任意類型,包括值,對象,可選,函數類型等。
    4. 碰見Any類型時候可能編譯器給出警報,這時候可以用 as Any來消除警報.
  2. as,as?,as!

    1. 如果涉及到向上轉型,值類型,case匹配對象,消除可選類型使用時候的警告用as。
    2. 如果涉及到向下轉型,可能會失敗用as?。
    3. 如果涉及到向下轉型,一定成功用as!。
class Animal {}
class Dog: Animal {}

/*** as使用場景 ***/
//1. as值類型
var a = 4
let b = a as Int

//2. as向上轉型
var c = Dog()
let d = c as Animal

//3. switch,case匹配對象
switch d {
case  _ as Dog :
    break
default:
    break
}

//4. 消除Any類型警報
var g: Int?
print(g as Any)

var h: Int? = 5
print(h!)
print(h as Any)

/*** as?使用場景 ***/
//1. 向下轉型可能會失敗
var e = d as? Dog

/*** as!使用場景 ***/
//1. 向下轉型確保一定成功
var f = d as! Dog
  1. 由於使用了可選類型可能導致警報,這時候如果確定可選類型一定有值。那麼可以用!強制解包,也可以用 a as Any來解決警報。
    這時候如果可能是缺省值那麼就只能用a as Any來解決警報。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章