Swift中類型轉換使用 is 和 as操做符。使用這兩個操做符能夠檢查值的類型或者轉換他的類型swift
class Animal: NSObject { var name: String! init(name: String) { self.name = name } } class Dog: Animal { var color: UIColor! init(name: String,color: UIColor) { self.color = color super.init(name: name) } } class Cat: Animal { var weight: Float! init(name: String,weight: Float) { self.weight = weight super.init(name: name) } } let animals = [Dog.init(name: "tiger", color: UIColor.yellow), Dog.init(name: "wangcai", color: UIColor.black), Cat.init(name: "hellokitty", weight: 10.0)]
如上建立三個類: Animal,Dog,Cat ,其中Cat和Dog繼承與Animal 。建立了一個容器,容器中有兩個Dog和一個Cat的實例。數組
var dogCount = 0 var catCount = 0 for animal in animals { if animal is Dog { dogCount += 1 } else if animal is Cat { catCount += 1 } }
如上在for 循環中使用 is 進行判斷 -->若 animal 是 Dog 類型的實例返回 true,不然返回false (相似OC中的 isKindOfClass:)app
某類型的一個常量或變量可能實際上屬於一個子類。當肯定是這種狀況時,你能夠嘗試向下轉到它的子類型,用類型轉換操做符(as? 或 as!)。函數
由於向下轉型可能會失敗,類型轉型操做符帶有兩種不一樣形式。條件形式(conditional form) as? 返回一個你 試圖向下轉成的類型的可選值(optional value)。強制形式 as! 把試圖向下轉型和強制解包(force-unwrap s)轉換結果結合爲一個操做。spa
當你不肯定向下轉型能夠成功時,用類型轉換的條件形式( as? )。條件形式的類型轉換老是返回一個可選值(o ptional value),而且若下轉是不可能的,可選值將是 nil 。這使你可以檢查向下轉型是否成功。code
只有你能夠肯定向下轉型必定會成功時,才使用強制形式( as! )。當你試圖向下轉型爲一個不正確的類型 時,強制形式的類型轉換會觸發一個運行時錯誤。orm
for animal in animals { if let dog = animal as? Dog { printLog("\(dog.name)") } else if let cat = animal as? Cat { printLog("\(cat.name)") } }
如上使用 as? 進行轉換。嘗試將animal 轉換成 Dog或者Cat類型 若是成功則打印出動物的名字。繼承
注意:轉換並無改變實例。原來的實例保持不變,只是將他做爲被轉換成的類型來使用。教程
(OC中的強制類型轉換與它類似。如:一個數組中都是Dog的實例,要取出第一個實例能夠這樣寫: Dog *dog = (Dog *)dogArray[0])ip
Swift 爲不肯定類型提供了兩種特殊的類型別名:
• AnyObject 能夠表示任何類類型的實例。
• Any能夠表示任何類型,包括函數類型。
注意:
只有當你確實須要它們的行爲和功能時才使用Any和AnyObject。在你的代碼裏使用明確類型老是 更好的。
AnyObject相似OC的 id 類型,可是仍是有區別的。具體能夠參考 http://swifter.tips/any-anyobject/ 。
如下定義了一個[AnyObject]類型的數組,並放入了兩個 Dog 的實例。
let animals: [AnyObject] = [Dog.init(name: "tiger", color: UIColor.yellow), Dog.init(name: "wangcai", color: UIColor.black)]
由於知道這個數組只包含 Dog 實例,你能夠直接用(as!)下轉並解包到非可選的 Dog 類型:
for animal in animals { let dog = animal as! Dog // ... }
也可使用下面更簡短的寫法:
for dog in animals as! [Dog] { // ... }
下面的例子,使用 Any 類型來和混合的不一樣類型一塊兒工做,包括函數類型和非類類型。它建立了一個能夠存 儲 Any 類型的數組 things :
var things = [Any]() things.append(0) things.append(0.0) things.append(42) things.append(3.14159) things.append("hello") things.append((3.0, 5.0)) things.append(Dog(name: "wangcai", color: UIColor.black)) things.append({ (name: String) -> String in "Hello, \(name)" })
數組中包含了各類類型的值。
能夠在 switch 表達式的 case 中使用 is 和 as 操做符來找出只知道是 Any 或 AnyObject 類型的 常量或變量的具體類型。下面的示例迭代 things 數組中的每一項,並用 switch 語句查找每一項的類型。
for thing in things { switch thing { case 0 as Int: print("zero as an Int") case 0 as Double: print("zero as a Double") case let someInt as Int: print("an integer value of \(someInt)") case let someDouble as Double where someDouble > 0: print("a positive double value of \(someDouble)") case is Double: print("some other double value that I don't want to print") case let someString as String: print("a string value of \"\(someString)\"") case let (x, y) as (Double, Double): print("an (x, y) point at \(x), \(y)") case let dog as Dog: print("a dog called '\(dog.name)', color. \(dog.color)") case let stringConverter as String -> String: print(stringConverter("Michael")) default: print("something else") } }
reference:swift官方教程中文版 ,http://swifter.tips/any-anyobject/ 。