- 類型判斷操作符
- ==,!=判斷倆個值類型是否相等
- ===,!==判斷兩個引用是否是一個內存地址
- 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)")
- 向下轉型
- 當不確定轉型是否會是確定的子類類型時候要用as?
- 當確定轉型會是確定的子類類型時候要用as!
- 向上轉型總是會成功,沒有意義的!沒有關聯的對象轉型總是會失敗,也是沒意義的。所以只是存在向下轉型。轉成更加確定的類型。
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)")
-
Any與AnyObject區別
- AnyObject是Any的子類
- AnyObject只是表示對象類型
- Any可以表示所有任意類型,包括值,對象,可選,函數類型等。
- 碰見Any類型時候可能編譯器給出警報,這時候可以用 as Any來消除警報.
-
as,as?,as!
- 如果涉及到向上轉型,值類型,case匹配對象,消除可選類型使用時候的警告用as。
- 如果涉及到向下轉型,可能會失敗用as?。
- 如果涉及到向下轉型,一定成功用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
- 由於使用了可選類型可能導致警報,這時候如果確定可選類型一定有值。那麼可以用!強制解包,也可以用 a as Any來解決警報。
這時候如果可能是缺省值那麼就只能用a as Any來解決警報。