swift-is/as和anyObject/any

前言

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

類型轉換在 Swift 中使用 is 和 as 操作符實現。這兩個操作符提供了一種簡單達意的方式去檢查值的類型或者轉換它的類型。

is

is操作符用來判斷某一個對象是否是某一個特定的類,他會返回一個bool類型的值

假設這裏定義了三個類:animal , dog ,cat 如果兩個類沒有繼承關係 就會返回false 如果某個類的對象肯定自己是這個類 那麼也是自己的超類。

例子:

class animal{
    var sound:String

    init(sound:String){
        self.sound=sound
    }

}

class dog:animal{

    func bark()  {
        print("小狗的叫聲是:\(sound)")
    }

}


class cat:animal{
    func bark()  {
         print("小貓的叫聲是:\(sound)")
     }

}


var animal2 = animal(sound:"動物")
var gou:animal = dog(sound: "狗叫")
var mao:animal = cat(sound: "貓叫")

if animal2 is dog {
    print("animal是一隻小狗") //animal
}else{
     print("animal不是一隻小狗")
}

if animal2 is cat {
    print("animal是一隻貓")
}else{
     print("animal不是一隻貓")
}

if gou is dog {
    print("animal是一隻gou")
}else{
     print("animal不是一隻gou")
}

if mao is dog {
    print("mao是一隻gou")
}else{
     print("mao不是一隻gou")
}

運行結果:在這裏插入圖片描述
由運行結果可以看出 除了第三個 其他的返回都是false ,那我們來看下 第三個爲什麼返回ture,var gou:animal = dog(sound: “狗叫”) 由這句話 可以看出 dog類創建的真實對象是dog 所以他們的類型相同 返回ture 。
注意:以上所有的結果返回的都是bool類型,判斷的是一個類是不是另外一個類的類型

as

某類的一個常量或者變量 可能本質上是屬於一個字類 這個時候 我們可以嘗試 把它向下轉成一種 我們需要的類型 而向下轉性可能會導致 失敗 所以有如下 兩種情況需要我們注意:
1 如果不確定類型轉換是否成功 無比使用 as?(as的可選行) 然後通過nil判斷檢查是否成功
2 如果非常確定這個轉換一定成功 使用as!(as的強制解封格式) 如果解封失敗 會crash

例子:

class animal{
    var sound:String
    
    init(sound:String){
        self.sound=sound
    }
    
}

class dog:animal{
    
    func bark()  {
        print("小狗的叫聲是:\(sound)")
    }
    
}


class cat:animal{
    func bark()  {
         print("小貓的叫聲是:\(sound)")
     }
     
}
 
var animal2:animal = dog(sound: "gou")
//使用as? 轉換是一個 option 所以需要先進行解包
let dog1 = animal2 as? dog
dog1!.bark()
let dog2 = animal2 as! dog
dog2.bark()
let cat1 = animal2 as? cat

as 把一個父類實例轉換成子類實力
as? 成功會得到一個option的子類實力 失敗返回nil
as! 成功得到一個子類實力 失敗:報錯

運行結果:
在這裏插入圖片描述
分析:上面可以看出 dog類的實力化對象animal2 使用as?轉換dog 所以可以轉換成功 於是可以得到一個 可選型的子類實力。

在看最後一個 因爲實力化animal2的類是dog 所以aimal2轉換成cat會失敗 原因他們兩個真實的類型不一致 一個是 dog 一個是 cat

注意:as?和as!操作符的轉換規則完全一樣,但是as?會返回一個被轉換類型的可選類型,需要我們解封。因爲可選類型即使值不存在轉化失敗也不會導致程序報錯,所以當我們在開發的時候最好使用這種方式進行轉化,除非我們有百分之百的把握纔可以使用強制轉化

anyObject

anyObject表示任意一種類類型的實力 類似OC中的ID 那樣 不能表示非類類型實力 比如結構體實力 枚舉實力

class student{
    
    var name:String = ""
    
    init(name:String) {
        self.name=name
    }
    
    func study() {
        print("學生在學習")
    }
    
    
}

class teacher{
    var name:String = ""
    
    init(name:String) {
        self.name=name
    }
    
    func study2() {
        print("老師在講英語")
    }
    
    
}

class nihoa{
    var name:String = ""
    
    init(name:String) {
        self.name=name
    }
    
    func study3() {
        print("領導在開會")
    }
}


var persons = [AnyObject]()

let s1 = student(name: "asd")
let t1 = teacher(name: "libai")
let n1 = nihoa(name: "boss")
persons.append(s1)
persons.append(t1)
persons.append(n1)

for values in persons {
    
    if let student1 = values as? student {
        student1.study()
    }else if let teacher = values as? teacher {
        teacher.study2()
    }else if let nihoa = values as? nihoa {
           nihoa.study3()
    }
}

//或者

var s2:AnyObject = student(name: "kamsk")

if let values = s2 as? student {
    print(values.study() )
}


any

any表示任意類型 不侷限類類型 他除了包括anyobject修飾的類實力類型 也可以是 int Double String 結構體 枚舉


var  things = [Any]()
things.append( 1)
things.append( 2)
things.append( 3)
things.append( 4)
for valuse in things{
    print(valuse)
}


注意

Any 類型可以表示所有類型的值,包括可選類型。Swift 會在你用 Any 類型來表示一個可選值的時候,給你一個警告。如果你確實想使用 Any 類型來承載可選值,你可以使用 as 操作符顯式轉換爲 Any,如下所示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章