//類型轉(zhuǎn)換可以判斷實(shí)例的類型,也可以將實(shí)例看做是其父類或子類的實(shí)例。
//類型轉(zhuǎn)換在Swift中使用is和as操作符實(shí)現(xiàn)。這來那個歌操作符提供了一種簡單達(dá)意的方式去檢查值得類型或轉(zhuǎn)換它的類型。
//定義一個類層次作為例子
class MediaItem {//基類,為任何s在數(shù)字媒體庫的媒體項提供基礎(chǔ)功能
var name: String
init(name: String) {
self.name = name
}
}
class Movie: MediaItem {//繼承自MediaItem
var director: String//導(dǎo)演
init(name: String, director: String) {//電影名稱、導(dǎo)演
self.director = director
super.init(name: name)
}
}
class Song: MediaItem {//繼承自MediaItem
var artist: String//藝術(shù)家
init(name: String, artist: String) {//歌曲名稱、歌手
self.artist = artist
super.init(name: name)
}
}
let libraryM = [
Movie(name: "卡薩布蘭卡", director: "邁克爾柯蒂茲"),//電影名稱、導(dǎo)演
Song(name: "Blue Suede Shoes", artist: "貓王"),//歌曲名稱、歌手
Movie(name: "公民凱恩", director: "奧森·威爾斯"),//電影名稱、導(dǎo)演
Song(name: "The One And Only", artist: "切斯尼霍克斯"),//歌曲名稱、歌手
Song(name: "Never Gonna Give You Up", artist: "Rick Astley")//歌曲名稱、歌手
]
//上面的數(shù)組中,包含兩個類的實(shí)例,這兩個類都是繼承自MediaTtem類,故該數(shù)組類型被推斷為[MediaItem]
//檢查類型
//用類型檢查操作符(is)來檢查一個實(shí)例釋放屬于特定子類型。若實(shí)例輸入那個子類型,類型檢查操作符返回true,否則返回false
var movieCount = 0
var songCount = 0
for item in libraryM { //遍歷數(shù)組,計算其元素的類型個數(shù)
if item is Movie { // 若數(shù)組元素類型 是 Movie 類型
movieCount += 1
}else if item is Song { // 若數(shù)組元素類型 是 Song 類型
songCount += 1
}
}
print("多媒體數(shù)組中,一共有\(zhòng)(movieCount)部電影,\(songCount)首歌曲")
//向下轉(zhuǎn)型
//某類型的一個常量或變量可能在幕后實(shí)際上屬于一個子類,當(dāng)確定是這種情況是,可以嘗試向下轉(zhuǎn)到他的子類型,用類型轉(zhuǎn)換操作符(as? 或 as!)
//向下轉(zhuǎn)型可能會失敗,當(dāng)你不確定向下轉(zhuǎn)型會成功是,用(as?)將返回一個你試圖向下轉(zhuǎn)成的類型的可選值;當(dāng)確定一定會成功時,用(as!)若成功將返回你需要的類型,若不成功將報一個運(yùn)行時錯誤。
for item2 in libraryM {
if let movie = item2 as? Movie { //視圖將item2 轉(zhuǎn)換為 Movie的對象;若成功,將調(diào)用該對象的屬性
print("A----電影名:\(movie.name),導(dǎo)演:\(movie.director)")
}else if let song = item2 as? Song {
print("A----歌曲名:\(song.name),歌手:\(song.artist)")
}
}
//注意:以上的轉(zhuǎn)換沒有真的改變實(shí)例或他的值,只是簡單地把它作為它被轉(zhuǎn)換成的類型來使用。
//Any 和 AnyObject 的類型轉(zhuǎn)換
//Swift為不確定類型提供了兩種特殊的類型別名:Any可以表示任何類型,包括函數(shù)類型; AnyObject 可以表示任何類類型的實(shí)例。
var things = [Any]() //創(chuàng)建一個可以存儲任意類型的數(shù)組,包括函數(shù)類型 和 非類類型
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append("hello")
things.append((3.0,5.0))
things.append(Movie(name:"戰(zhàn)狼", director:"吳京"))
things.append({(name: String) -> String in "Hello,\(name)"})
//以上數(shù)組,包含兩個非類類型 Int 值、兩個 Double 值,一個String值,一個元組(Double,Double),一個Movie實(shí)例,以及一個接受String值并返回y另一個String值得閉包表達(dá)式。
for thing in things {
switch thing {//case 中使用 is 和 as 操作符來找出只知道是 Any 或 AnyObject 類型的常量或變量的具體類型。
case 0 as Int:
print("B-----Int型的0")
case 0 as Double:
print("B-----Double型的0")
case let someInt as Int:
print("B-----Int型的值:\(someInt)")
case let someDouble as Double where someDouble > 0:
print("B-----一個大于0的值:\(someDouble)")
case is Double:
print("B-----一個Double類型的值")
case let someString as String:
print("B-----一個字符串類型:\(someString)")
case let (x,y) as (Double, Double):
print("B-----一個Double類型的坐標(biāo)點(diǎn):\(x),\(y)")
case let movie as Movie:
print("B-----一部\(movie.director)導(dǎo)演的名為:\(movie.name)的電影")
case let stringConverter as (String) -> String:
print(stringConverter("B-----中國"))
default:
print("B-----其他打印")
}
}
//注意Any類型可以表示所有類型的值,包括可選類型;所以當(dāng)你用Any類型來表示一個可選值的時候回報一個警告,如果你確實(shí)想用Any類型來接收可選值,可以使用 as 操作符顯示轉(zhuǎn)換為Any:
let optionalNumber: Int? = 3
//things.append(optionalNumber) //會報警告
things.append(optionalNumber as Any) //不會報警告
22.Swift類型轉(zhuǎn)換
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 小學(xué)語文修改病句的方法 修改病句是小學(xué)語文考試中常見的題型,在修改病句之前,我們應(yīng)該清晰的了解有哪些病句現(xiàn)象,下面...
- 編程特點(diǎn):1、不需要引入頭文件2、不需要再每一句加上分號3、變量使用腿短類型是代碼更干凈,不易犯錯誤4、模塊消除了...
- 1. 錯誤處理 錯誤處理(Error handling)是響應(yīng)錯誤以及從錯誤中恢復(fù)的過程。Swift 提供了在運(yùn)行...
- 這兩章比較簡單, 以類型轉(zhuǎn)換這一章更為重要和常見. 類型轉(zhuǎn)換(Type Casting) 秉著沒有最簡潔只有更簡潔...
- 1.類型檢查符is 類型檢查操作符is,可以檢查一個對象是不是某個類的對象,如果是,則返回true,否則返回fal...