iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0

類型檢查

Swift中,資料的檢查和轉換需要使用 isas 關鍵字。

var str = "andy"
// 進行實例的類型檢查
if str is String {
    print("str is String")
}

對於有繼承關係的類,檢查有如下原則

  • 子類實例劑型父類類型的檢查可以檢查成功
  • 費類實例進行子類檢查類型的檢查不可以檢查成功
    上面的兩條原則就是向下轉換原則
// 建立一個基類
class BaseClass {
    
}
// 建立一個子類
class MyClass: BaseClass{
    
}
var cls1 = BaseClass()
var cls2 = MyClass()
// 使用父類實例來進行子類類型的檢查,會返回false
if cls1 is MyClass {
    print("cls is MyClass")
}
// 使用子類實例來進行父類類型的檢查,會返回true
if cls2 is BaseClass {
    print("cls2 is BaseClass")
}

類型轉換

類型轉換,Swfit使用的是 as 關鍵字,與類型檢查相似,Swift中有向上兼容向下轉換的原則。

  • 一個父類類型的集合可以接收子類類型的實例。
  • 在使用第一條原則父類集合中的實例時,可以將其專換成子類類型。
// 自定義一個類及其子類
class MyClass: BaseClass{
    var name: String?
}
class MySubClassOne: MyClass{
    var count: Int?
}
class MySubClassTwo: MyClass{
    var isBiger: Bool?
}
// 建立三個實例
var obj1 = MyClass()
obj1.name = "andy"
var obj2 = MySubClassOne()
obj2.count = 100
var obj3 = MySubClassTwo()
obj3.isBiger = true
// 將實例存放在其公共父類類型的陣列集合中
var array[MyClass] = [obj1,obj2,obj3]
// 進行遍歷
for var i in 0..<array.count {
    var obj = array[i]
    if obj is MySubClassOne {
        // 進行類型轉換
        print((obj as! MySubClassOne).count!)
        continue
    }
    if obj is MySubClassTwo {
        // 進行類型轉換
        print((obj as! MySubClassTwo).isBiger!)
        continue
    }
    if obj is MyClass {
        // 使用父類共有的屬性
        print(obj.name)
    }
}

在使用類型轉換時,需要使用as?或是as!是一種比較安全的轉換方式,其會將類型轉換後的結果映射為Optional值,如果類型轉換成功,則值為原實例,如果類型轉換失敗,則會返回Optional值nil。而as!是一種強制轉換方式,其默認此次轉換一定成功,如果轉換失敗,則會產生運行時錯誤,程式會crash,開發者在使用as!類型轉換時,必須保證實例的真實類型和要轉換的類型一致。

接下來,是類型轉換的介紹


上一篇
Day28 Any與AnyObject
下一篇
Day30 學習資源分享
系列文
初入Swift新手村的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言