Swift學(xué)習(xí)筆記十八之類型轉(zhuǎn)換

1、類型轉(zhuǎn)換:使用is和as來檢查值的類型和轉(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)來檢查一個(gè)實(shí)例是否屬于特定子類型,若是則返回true否則返回false

var movieCount = 0
var songCount = 0

for item in library {
if item is Movie { // is用來檢查item是否屬于Media的子類Movie
movieCount += 1
}else if item is Song {
songCount += 1
}
}
print("movieCount:(movieCount), songCount:(songCount)") // movieCount:1, songCount:2

3、向下類型轉(zhuǎn)換:通過類型轉(zhuǎn)換符(as?或as!)將某個(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 { // 使用可選綁定來解包
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來轉(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")
}
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 132.轉(zhuǎn)換錯(cuò)誤成可選值 通過轉(zhuǎn)換錯(cuò)誤成一個(gè)可選值,你可以使用 try? 來處理錯(cuò)誤。當(dāng)執(zhí)行try?表達(dá)式時(shí),如果...
    無灃閱讀 1,293評(píng)論 0 3
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語閱讀 3,865評(píng)論 0 6
  • 本章將會(huì)介紹 定義一個(gè)類層次作為例子檢查類型向下轉(zhuǎn)型Any 和 AnyObject 的類型轉(zhuǎn)換嵌套類型實(shí)踐引用嵌套...
    寒橋閱讀 353評(píng)論 0 1
  • 六六寫的文章,愛情折中就好! 讀完陷入沉思:我究竟想要怎樣的丈夫? 不知是因?yàn)槭裁词裁磶啄曛W還是已經(jīng)麻木了生活?...
    親愛的Leah閱讀 253評(píng)論 1 1
  • 繁忙的生活需要一點(diǎn)點(diǎn)的儀式感增加趣味。所以2016年的最后一天,你在做些什么?提筆時(shí),圖書館四樓西的窗戶里折射...
    阿花_啊閱讀 414評(píng)論 0 0