在Objective-C和Java中,任何類型實例均可以經過強轉使編譯器認爲它是另外一種類型的實例,這麼作實際上是將全部的安全檢查工做都交給了開發者本身來作。先比之下,Swift中的Optional類型轉換就會比較安全與可靠。javascript
Swift中使用is關鍵字來進行類型的檢查,其會返回一個布爾值true或者false來代表檢查是否成立,示例以下:java
var str = "HS" if str is String { print(str) }
Swift中有向上兼容與向下轉換的特性,就是說,一個父類類型的集合能夠接收子類的實例,一樣,在使用這些實例變量時能夠將其向下轉換爲子類類型,示例以下:數組
//自定義一個類及其子類 class MyClass { var name:String? } class MySubClassOne: MyClass { var count:Int? } class MySubClassTwo: MyClass { var isBiger:Bool? } //建立3個實例 var obj1 = MyClass() obj1.name = "HS" 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?來進行,as!是一種強制轉換方法,它在開發者肯定類型無誤是使用,若是用as!轉換的類型有誤,則會出現運行時錯誤。as?是Optional類型轉換,若是轉換失敗,則會返回nil。安全
在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類型更增強大,其能夠混合值類型和引用類型一塊兒工做,示例以下:spa
var anyArray:[Any] = [100,"HS",obj1,obj2,false,(1.1),obj3,{()->() in print("Closures")}]
上面示例的數組中包含了整型,字符串類型,引用類型,布爾類型和閉包。code
專一技術,熱愛生活,交流技術,也作朋友。ip
——琿少 QQ羣:203317592開發