蘋果新的編程語言 Swift 語言進階(十三)--類型檢查與類型嵌套
一 類型檢查
1、 類型檢查操作符
類型檢查用來檢查或轉換一個實例的類型到另外的類型的一種方式。
在Swift中,類型檢查使用is和as操作符來實現。
is操作符用來檢查一個實例是否是某種特定類型,假設是返回true,否則返回false。
as操作符用來把某個實例轉型為另外的類型,因為實例轉型可能失敗。因此Swift為as操作符提供了兩種形式:選項形式as?和強制形式as。
選項形式(as?)的操作運行轉換並返回期望類型的一個選項值,假設轉換成功則返回的選項包括有效值。否則選項值為 nil
強制形式(as )的操作執行一個實例到目的類型的強制轉換,因此使用該形式可能觸發一個執行時錯誤。
例如以下例所看到的。
class MediaItem {
var name:String
init(name:String) {
self.name =name
}
}
class Movie:MediaItem {
var director:String
init(name:String,director:String) {
self
.director =directorsuper.init(name:name)
}
}
class Song:MediaItem {
var artist:String
init(name:String,artist:String) {
self.artist =artist
super.init(name:name)
}
}
let library = [
Movie(name:"Casablanca",
director:"Michael Curtiz"),Song(name:"Blue Suede Shoes",artist:"Elvis Presley"),
Astley")
]
var movieCount =0
var songCount =0
for item in library {
if item is Movie {
++movieCount
}else if item is Song {
++songCount
}
}
for item in library {
if let movie =item as? Movie {
println("Movie: ‘\(movie.name)‘, dir. \(movie.director)")
}else if let song =item as? Song {
println("Song: ‘\(song.name)‘, by \(song.artist)")
}
}
本例首先定義了一個媒體類的繼承樹。當中兩個類Movie和Song都繼承自其基類MediaItem。接著定義一個包括這兩個媒體項實例的數組library,然後在for in循環中使用is操作符來檢查某個媒體項是否是特定類型的實例。使用as操作符的選項形式as?
來轉換媒體項的實例為特定類型的實例。
2、 隨意類型的使用
Swift提供了兩個特定的類型別名:AnyObject與Any。
AnyObject類型能代表不論什麽類類型。
Any類型能代表隨意除了函數類型之外的全部其他類型。
樣例展示了怎樣使用AnyObject類型定義一個AnyObject類型的數組以及該數組的使用,AnyObject類型的數組成員能夠是隨意的類的實例,樣例中為Movie類的實例。
let someObjects:AnyObject[] = [
Movie(name:"2001: A Space Odyssey",director:"Stanley Kubrick"),
Movie(name:"Moon",director:"Duncan Jones"),
]
for object in someObjects {
let movie =object as Movie
println("Movie: ‘\(movie.name)‘, dir. \(movie.director)")
}
//以上循環使用as操作符強制轉換一個類型為AnyObject的實例為確定的類型Movie類的實例,因此可能出現執行時錯誤。
//也能夠直接使用as 操作符直接把someObjects類型的數組轉型為Movie類型的數組。例如以下:
for movie in someObjects as Movie[] {
println("Movie: ‘\(movie.name)‘, dir. \(movie.director)")
}
例如以下樣例展示Any的使用。能夠使用Any來取代不論什麽類型。
var things =Any[]()
things.append(0)
things.append(0.0)
things.append("hello")
things.append((3.0,5.0))
things.append(Movie(name:"Ghostbusters",director:"Ivan Reitman"))
Any類型的數組能夠包括隨意類型的實例,如本例Any類型的數組things包括一個整數、浮點數、字符串、多元組、類的實例。
二 類型嵌套
類型嵌套同意你在一種類型中嵌套定義第二種類型。
在另外類型中定義的類型稱為嵌套類型。嵌套類型定義在它的支持類型內部。類型可以多級嵌套,嵌套類型內部可以再嵌套定義另外的類型。例如以下樣例所看到的:
struct BlackjackCard {
// nested Rank enumeration
enum Rank:Int {
case Jack, Queen, King, Ace
// nested Values struct
struct Values {
let first:Int,second:Int?
}
}
}
使用點語法來存取一個嵌套類型的屬性、方法、或下標。
從嵌套類型的最外一級類型開始。一級級地向內獲得要查詢的嵌套類型的屬性、方法、或下標。
例如以下所看到的:
let jackSymbol =BlackjackCard.Rank.Jack.toRaw()
蘋果新的編程語言 Swift 語言進階(十三)--類型檢查與類型嵌套