swift類型轉換is和as

Swift中類型轉換使用 isas操做符。使用這兩個操做符能夠檢查值的類型或者轉換他的類型swift

1、類型檢查

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

2、向下轉型

某類型的一個常量或變量可能實際上屬於一個子類。當肯定是這種狀況時,你能夠嘗試向下轉到它的子類型,用類型轉換操做符(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

3、Any和AnyObject的類型轉換

Swift 爲不肯定類型提供了兩種特殊的類型別名:

• AnyObject 能夠表示任何類類型的實例

• Any能夠表示任何類型,包括函數類型。

注意:
只有當你確實須要它們的行爲和功能時才使用Any和AnyObject。在你的代碼裏使用明確類型老是 更好的。

AnyObject相似OC的 id 類型,可是仍是有區別的。具體能夠參考 http://swifter.tips/any-anyobject/ 。

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 類型來和混合的不一樣類型一塊兒工做,包括函數類型和非類類型。它建立了一個能夠存 儲 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 中使用 isas 操做符來找出只知道是 AnyAnyObject 類型的 常量或變量的具體類型。下面的示例迭代 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/ 。

相關文章
相關標籤/搜索