1. 程式人生 > >蘋果新的編程語言 Swift 語言進階(十三)--類型檢查與類型嵌套

蘋果新的編程語言 Swift 語言進階(十三)--類型檢查與類型嵌套

兩個類 nes left p s 查詢 text edi host letter

一 類型檢查

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 =director

super.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 語言進階(十三)--類型檢查與類型嵌套