在Swift開發過程中,我們會遇到以下情況:判斷某個實例是那個類生成的;將子類轉換為父類;想讓一個變量可以為任何類型(值對象、引用對象、方法)。。。
Swift也能處理這些情況,需要使用的關鍵字:類型判斷is、類型轉換as、屬性聲明AnyObject和Any。
在介紹這四個關鍵字的使用前,先構建類MediaItem、Movie和Song。
~~~
class MediaItem {
}
class Movie: MediaItem {
}
class Song: MediaItem {
}
~~~
其中Movie和Song都繼承MediaItem。
## Is
is主要用于類型判斷,如我們判斷某個實例是那個類的子類,或是那個類生成的。
~~~
let array = [Song(), Movie()]
// is測試,類型判斷
for item in array {
if item is Movie {
print("Movie構建")
} else if item is Song {
print("Song構建")
}
}
~~~
## As
as主要用于類型轉換,可將一個類轉換為另一個類。as后可以跟’?’或’!’。
- as?:預轉換,轉換失敗時,返回nil。
- as!:強轉換,轉換失敗時,程序崩潰。
~~~
for item in array {
if let movie = item as? Movie {
print("可轉換為Movie: '\(movie)'")
} else if let song = item as? Song {
print("可轉換為Song: '\(song)'")
}
// 強轉換,失敗時,程序崩潰
let movie = item as! Movie
}
~~~
## AnyObject
使用AnyObject聲明的常量(變量)可以是值對象或引用對象。
~~~
let someObjects: [AnyObject] = [Movie(), 1, "33"]
~~~
## Any
Any和AnyObject具有相同的特性,只是Any還可以代表方法和閉包。
~~~
var things = [Any]()
things.append(0) // 值類型
things.append(Movie()) // 引用類型
things.append({ (name: String) -> String in "Hello, \(name)" }) // 閉包
~~~
## 其他
### 參考資料
[The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html)
### 文檔修改記錄
| 時間 | 描述 |
|-----|-----|
| 2015-11-1 | 根據 [The Swift Programming Language (Swift 2.1)](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html)中的Type Casting總結 |
版權所有:[http://blog.csdn.net/y550918116j](http://blog.csdn.net/y550918116j)
- 前言
- Swift函數
- Swift閉包(Closures)
- Swift枚舉(Enumerations)
- Swift類和結構體(Classes and Structures)
- Swift屬性(Properties)
- Swift方法(Methods)
- Swift下標(Subscripts)
- Swift繼承(Inheritance)
- Swift初始化(Initialization)
- Swift銷毀(Deinitialization)
- Swift可選鏈(Optional Chaining)
- Swift錯誤處理(Error Handling)
- Swift類型選擇(Type Casting)
- Swift協議(Protocols)
- Swift訪問控制(Access Control)
- Swift高級運算符(Advanced Operators)