17 Swift型別轉換

2021-10-10 21:07:03 字數 2904 閱讀 9608

型別轉換可以判斷例項的型別,也可以將例項看做是其父類或子類的例項。

在swift中型別轉換使用isas操作符實現,這兩個操作符提供了一種簡單明瞭的方式去檢查值的型別或轉換其他型別。

可以將型別轉換用在類和子類的層次結構上,檢查特定型別例項的型別並且轉換這個類例項的型別為這個層次結構中的其他型別:

// 人的類

class person

}// 學生的類,繼承自person

class student:person

}// 工人的類,繼承自person

class worker:person

}// 常量陣列

let library = [

student(name: "張三", grade: "一年級(1)班"),

worker(name: "李明", profession: "教師"),

student(name: "李四", grade: "二年級(3)班"),

worker(name: "小紅", profession: "醫生"),

student(name: "王五", grade: "三年級(6)班"),

]/** 常量library沒有設定型別,而系統會自動推斷出其型別是person,

因為student和worker類的共同父類是person

*/

用型別檢查操作符is來檢查乙個例項是否屬於特定子型別,若例項屬於那個子型別,型別檢查操作符返回true,否則返回false

// 計算常量陣列library中學生和工作者的個數

var studentcount = 0

var workercount = 0

for item in library

else if item is worker

}print("學生個數:\(studentcount),工作者的個數:\(workercount)")

輸出結果:

學生個數:3,工作者的個數:2

某型別的乙個常量或變數實際上是屬於乙個子類,那麼可以嘗試向下轉到子類型別,用型別轉換操作符as?as!

而向下轉型可能會失敗,型別轉換操作符有兩種形式。條件形式as?,返回乙個試圖向下轉成的型別的可選型別。強制形式as!把試圖向下轉型和強制拆包結果作為乙個混合動作。

當不確定轉型是否成功,建議用條件形式as?。條件形式的型別轉換總是返回乙個可選型別的,且向下轉型不可能的,可選值就是為nil,這也就可以檢查向下轉型是否成功。

只有當確定向下轉型一定會成功時,才使用強制形式as!。但試圖向下轉型為乙個不正確型別時,這就會導致程式崩潰。

// 因為library系統自動推斷是person,即item都是person型別

for item in library

if let worker = item as? worker

}輸出結果:

學生:張三 班級:一年級(1)班

學生:李四 班級:二年級(3)班

學生:王五 班級:三年級(6)班

注意: 型別轉換沒有真正改變例項中的值,即是例項根本就是保持不變的,只是簡單地把例項作為它被轉換成的型別來使用。

swift中為不確定型別提供了兩種特殊型別別名:

-anyobject可以代表任何類的例項;

-any可以表示任何型別,包括方法型別;

// 定義乙個 `[anyobject]` 型別的陣列

let someobjects:[anyobject] = [

student(name: "李明", grade: "九年級(3)班"),

student(name: "蕭十一", grade: "八年級(7)班"),

student(name: "王八", grade: "三年級(5)班")

]// someobjects陣列只包含student例項,所以可以直接用強制型別(as!)

for object in someobjects

// 更為簡短形式

// 直接將陣列進行型別轉換

for student in someobjects as! [student]

輸出結果:

名字:李明 班級:九年級(3)班

名字:蕭十一 班級:八年級(7)班

名字:王八 班級:三年級(5)班

>>> 名字:李明 班級:九年級(3)班

>>> 名字:蕭十一 班級:八年級(7)班

>>> 名字:王八 班級:三年級(5)班

// 可以任意型別的陣列trings

var things = [any]()

// 整形

// 浮點型

// 整形

// 字串

// student例項

// 閉包

(name:string) -> string in

return "hello \(name)"

})// 將things陣列中元素對應列印出來

for thing in things

}輸出結果:

整形: 0

浮點型: 3.3

整形: 99

>>> 存在有字串

名字:多多 班級:幼兒園(小班)

hello endevent

Swift 型別轉換

import uikit 1.定義基類 mediaitem 2.定義子類 movie 3.定義子類 song class mediaitem class movie mediaitem class song mediaitem let library movie name movie1 direct...

swift 物件型別轉換

swift 中物件是可以轉換的,因為物件導向就會涉及繼承,子類,父類等等 有幾點規則我們先說一下 子類物件可以直接轉換為父類物件的 父類物件可以有條件的轉換為子類物件,這個我們下邊在講 首先我們建立三個類 人 homan 男人 man 男孩 boy man 繼承 homan boy 繼承 homan...

Swift 學習筆記 型別轉換

1 子類的物件賦值為基類 原型類 class entity func showtag 人物類 class hero entity 怪物類 class monster entity var hero entity hero entityname 火女 hero.showtag var monster ...