型別轉換可以判斷例項的型別,也可以將例項看做是其父類或者子類的例項。
型別轉換在 swift 中使用 is 和 as 操作符實現。這兩個操作符提供了一種簡單達意的方式去檢查值的型別或者 轉換它的型別。
你也可以用它來檢查乙個類是否實現了某個協議。
你可以將型別轉換用在類和子類的層次結構上,檢查特定類例項的型別並且轉換這個類例項的型別成為這個層次
結構中的其他型別。下面的三個**段定義了乙個類層次和乙個包含了幾個這些類例項的陣列,作為型別轉換的
例子。
第乙個**片段定義了乙個新的基礎類 mediaitem 。這個類為任何出現在數字**庫的**項提供基礎功 能。特別的,它宣告了乙個 string 型別的 name 屬性,和乙個 init name 初始化器。(假定所有的**項都 有個名稱。)
self.name = name }}
下乙個**段定義了 mediaitem 的兩個子類。第乙個子類 movie 封裝了與電影相關的額外資訊,在父類(或 者說基類)的基礎上增加了乙個 director (導演)屬性,和相應的初始化器。第二個子類 song ,在父類的基 礎上增加了乙個 artist (藝術家)屬性,和相應的初始化器:
class movie: mediaitem
}class song: mediaitem
}
最後乙個**段建立了乙個陣列常量 library ,包含兩個 movie 例項和三個 song 例項。 library 的型別是在 它被初始化時根據它陣列中所包含的內容推斷來的。swift的型別檢測器能夠推理出 movie 和 song 有共同的 父類 mediaitem ,所以它推斷出 [mediaitem] 類作為 library 的型別。
let library = [
movie(name: "casablanca", director: "michael curtiz"), song(name: "blue suede shoes", artist: "elvis presley"), movie(name: "citizen kane", director: "orson welles"), song(name: "the one and only", artist: "chesney hawkes"), song(name: "never gonna give you up", artist: "rick astley")
]// the type
of"library"
is inferred to be [mediaitem]
在幕後 library 裡儲存的**項依然是 movie 和 song 型別的。但是,若你迭代它,依次取出的例項會是 ediaitem 型別的,而不是 movie 和 song 型別。為了讓它們作為原本的型別工作,你需要檢查它們的型別或 者向下轉換它們到其它型別,就像下面描述的一樣。
用型別檢查操作符( is )來檢查乙個例項是否屬於特定子型別。若例項屬於那個子型別,型別檢查操作符返回
e ,否則返回 false 。
下面的例子定義了兩個變數, moviecount 和 songcount ,用來計算陣列 library 中 movie 和 song 類 型的例項數量。
var moviecount = 0
var songcount = 0
for item in library else
if item is song
}print("media library contains \(moviecount) movies and \(songcount) songs") // prints "media library contains 2 movies and 3 songs"
示例迭代了陣列 library 中的所有項。每一次, for - in 迴圈設定 item 為陣列中的下乙個 mediaitem 。
若當前 mediaitem 是乙個 movie 型別的例項, item is movie 返回 true ,相反返回 false 。同樣的, ite m is song 檢查item是否為 song 型別的例項。在迴圈結束後, moviecount 和 songcount 的值就是被找 到屬於各自的型別的例項數量。
某型別的乙個常量或變數可能在幕後實際上屬於乙個子類。當確定是這種情況時,你可以嘗試向下轉到它的子類
型,用型別轉換操作符( as? 或 as! )
因為向下轉型可能會失敗,型別轉型操作符帶有兩種不同形式。條件形式(conditional form) as? 返回乙個 你試圖向下轉成的型別的可選值(optional value)。強制形式 as! 把試圖向下轉型和強制解包(force-unwr aps)結果作為乙個混合動作。
當你不確定向下轉型可以成功時,用型別轉換的條件形式( as? )。條件形式的型別轉換總是返回乙個可選值(op tional value),並且若下轉是不可能的,可選值將是 nil 。這使你能夠檢查向下轉型是否成功。
只有你可以確定向下轉型一定會成功時,才使用強制形式( as! )。當你試圖向下轉型為乙個不正確的型別時,強 制形式的型別轉換會觸發乙個執行時錯誤。
下面的例子,迭代了 library 裡的每乙個 mediaitem ,並列印出適當的描述。要這樣做, item 需要真正作為 movie 或 song 的型別來使用,不僅僅是作為 mediaitem 。為了能夠在描述中使用 movie 或 song 的
irector 或 artist 屬性,這是必要的。
在這個示例中,陣列中的每乙個 item 可能是 movie 或 song 。事前你不知道每個 item 的真實型別,所以 這裡使用條件形式的型別轉換( as? )去檢查迴圈裡的每次下轉。
for item in library else
iflet song = item as? song }//
movie: 'casablanca', dir. michael curtiz
//song: 'blue suede shoes', by elvis presley
//movie: 'citizen kane', dir. orson welles
//song: 'the one and only', by chesney hawkes
//song: 'never gonna give you up', by rick astley
movie(name: "2001: a space odyssey", director: "stanley kubrick"), movie(name: "moon", director: "duncan jones"),
movie(name: "alien", director: "ridley scott")]
因為知道這個陣列只包含movie
例項,你可以直接用(as!
)下轉並解包到不可選的movie
型別:
for
object
in someobjects
// movie: '2001: a space odyssey', dir. stanley kubrick // movie: 'moon', dir. duncan jones
// movie: 'alien', dir. ridley scott
為了變為乙個更短的形式,下轉someobjects
陣列為 [movie
] 型別來代替下轉陣列中每一項的方式。
for movie in someobjects as! [movie]
// movie: '2001: a space odyssey', dir. stanley kubrick // movie: 'moon', dir. duncan jones
// movie: 'alien', dir. ridley scott
這裡有個示例,使用 any 型別來和混合的不同型別一起工作,包括方法型別和非 class 型別。它建立了乙個 可以儲存 any 型別的陣列 things 。
var things = [any]()
"hello, \(name)" })
things 陣列包含兩個 int 值,2個 double 值,1個 string 值,乙個元組 (double, double) ,電影「gho stbusters」,和乙個獲取 string 值並返回另乙個 string 值的閉包表示式。
你可以在 switch 表示式的cases中使用 is 和 as 操作符來發覺只知道是 any 或 anyobject 的常量或變 量的型別。下面的示例迭代 things 陣列中的每一項的並用 switch 語句查詢每一項的型別。這幾種 switch 語 句的情形繫結它們匹配的值到乙個規定型別的常量,讓它們的值可以被列印:
for thing in things }
// zero as an int
// zero as a double
// an integer value of 42
// a positive double value of 3.14159
// a string value of "hello"
// an (x, y) point at 3.0, 5.0
// a movie called 'ghostbusters', dir. ivan reitman // hello, michael
*注意:
在乙個switch語句的case中使用強制形式的型別轉換操作符(as, 而不是 as?)來檢查和轉換到乙個明確的類 型。在 switch case 語句的內容中這種檢查總是安全的。*
Swift18 型別轉換
定義乙個型別層次作為例子 檢查型別 向下轉換 any和anyobject的型別轉換。型別轉換可以判斷例項的型別,也可以將例項看作是其父類或者子類的例項。型別轉換在swift中使用is和as操作符實現。這兩個操作符提供了一種簡單達意的方式去檢查其值的型別或者轉換它的型別。也可以用它來檢查乙個型別是否實...
iOS開發 Swift 總結30 型別轉換
第2部分 故事的高階要素 程式語言swift的高階部分 18 型別轉換 18.1 概念通俗講解 型別轉換就是轉換當前常量,變數,例項的型別。例如int型別轉換為string 18.2 定義簡潔介紹 下面介紹4個常用的使用場景 1 普通資料轉換 用構造方法 例如int轉換為string,如下 let ...
swift基礎day6 型別轉換 巢狀型別
型別轉換在 swift 中使用 is 和 as 分別提供了一種方式去檢查值的型別或者轉換它的型別。為型別轉換定義類層次 將型別轉換用在類和子類的層次結構上,檢查特定類例項的型別並且轉換這個類例項的型別成為這個層次結構中的其他型別.class mediaitem class movie mediait...