一、類型檢查與轉(zhuǎn)換
在Objective-C和Java中,任何類型實例都可以通過強轉(zhuǎn)使編譯器認為它是另一種類型的實例,這么做其實是將所有的安全檢查工作都交給了開發(fā)者自己來做。先比之下,Swift中的Optional類型轉(zhuǎn)換就會比較安全與可靠。
Swift中使用is關鍵字來進行類型的檢查,其會返回一個布爾值true或者false來表明檢查是否成立,示例如下:
var str = "HS"if str is String { print(str)}
Swift中有向上兼容與向下轉(zhuǎn)換的特性,就是說,一個父類類型的集合可以接收子類的實例,同樣,在使用這些實例變量時可以將其向下轉(zhuǎn)換為子類類型,示例如下:
//自定義一個類及其子類class MyClass { var name:String?}class MySubClassOne: MyClass { var count:Int?}class MySubClassTwo: MyClass { var isBiger:Bool?}//創(chuàng)建3個實例var obj1 = MyClass()obj1.name = "HS"var obj2 = MySubClassOne()obj2.count = 100var obj3 = MySubClassTwo()obj3.isBiger=true//將實例存放在其公共父類類型的數(shù)組集合中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!) }}
有一點需要注意,在進行類型轉(zhuǎn)換時,可以使用as!或者as?來進行,as!是一種強制轉(zhuǎn)換方法,它在開發(fā)者確定類型無誤是使用,如果用as!轉(zhuǎn)換的類型有誤,則會出現(xiàn)運行時錯誤。as?是Optional類型轉(zhuǎn)換,如果轉(zhuǎn)換失敗,則會返回nil。
二、Any和AnyObject類型
在Objective-C中,常常使用id來表示引用類型的泛型,Swift中的AnyObject與之類似。示例如下:
//進行遍歷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 as! MyClass).name!) }}
Any類型則比AnyOject類型更加強大,其可以混合值類型和引用類型一起工作,示例如下:
var anyArray:[Any] = [100,"HS",obj1,obj2,false,(1.1),obj3,{()->() in print("Closures")}]
上面示例的數(shù)組中包含了整型,字符串類型,引用類型,布爾類型和閉包。
新聞熱點
疑難解答