1口糕、類型轉(zhuǎn)換:使用is和as來(lái)檢查值的類型和轉(zhuǎn)換類型
class Media { // 定義一個(gè)基類
var name: String // 提供一個(gè)name屬性
init(name: String) {
self.name = name
}
}
class Movie: Media {
var director: String // 在繼承基類的基礎(chǔ)上多了一個(gè)導(dǎo)演屬性
init(name: String, director: String) {
self.director = director
super.init(name: name)
}
}
class Song: Media {
var artist: String // 在繼承基類的基礎(chǔ)上多了一個(gè)藝術(shù)家屬性
init(name: String, artist: String) {
self.artist = artist
super.init(name: name)
}
}
let library = [Movie(name: "AF", director: "Aedc"), // library的類型為[Media]類型
Song(name: "CV", artist: "Lona"),
Song(name: "CV", artist: "Lona")]
let item1 = library[0] // item1的類型為父類Media,而不是Movie
2怒炸、類型檢查:使用類型檢查符(is)來(lái)檢查一個(gè)實(shí)例是否屬于特定子類型阐虚,若是則返回true否則返回false
var movieCount = 0
var songCount = 0
for item in library {
if item is Movie { // is用來(lái)檢查item是否屬于Media的子類Movie
movieCount += 1
}else if item is Song {
songCount += 1
}
}
print("movieCount:(movieCount), songCount:(songCount)") // movieCount:1, songCount:2
3、向下類型轉(zhuǎn)換:通過(guò)類型轉(zhuǎn)換符(as帝嗡?或asK健)將某個(gè)類型轉(zhuǎn)換為實(shí)際子類型
for item in library {
if let movie = item as? Movie { // 不確定向下類型轉(zhuǎn)換是否可以成功用as?,此時(shí)會(huì)返回一個(gè)可選值
print("director:(movie.director)")
} else if let song = item as? Song { // 使用可選綁定來(lái)解包
print("artist:(song.artist)")
}
}
// 如果確定類型轉(zhuǎn)換會(huì)成功可以使用強(qiáng)制類型轉(zhuǎn)換(as!),但如果轉(zhuǎn)換失敗會(huì)報(bào)錯(cuò)
4、使用any和AnyObjet進(jìn)行類型轉(zhuǎn)換:AnyObject表示任何類型的實(shí)例繁莹,Any:表示任何類型
// 定義一個(gè)AnyObject類型的數(shù)組,并設(shè)置3個(gè)Movie類型的實(shí)例
let objects: [AnyObject] = [Movie(name: "AF", director: "Aedc"),
Movie(name: "AF", director: "Aedc"),
Movie(name: "AF", director: "Aedc")]
for object in objects {
let movie = object as! Movie // 使用as!強(qiáng)制類型轉(zhuǎn)換并解包Movie類型
print(movie.director)
}
for object in objects as! [Movie] { // 或者可以直接將objects轉(zhuǎn)化成[Movie]類型
print(object.director)
}
var things = Any // 定義一個(gè)可以存儲(chǔ)任何類型的數(shù)組
things.append(2) // 添加一個(gè)Int類型的整數(shù)
things.append(3.4) // Double類型
things.append("A") // String類型
things.append((2, 3)) // 元組類型
things.append({ (name: String) -> String in "Hello, (name)"}) //閉包類型
for thing in things {
switch thing {
case let intValue as Int: // 使用as來(lái)轉(zhuǎn)化成具體類型
print(intValue)
case let doubleValue as Double:
print(doubleValue)
case let stringValue as String:
print(stringValue)
case let (x, y) as (Int, Int):
print("(x),(y)")
case let stringConverter as (String) -> String:
print(stringConverter("Lily"))
default:
print("Something else")
}
}