型別轉換在 swift 中使用 is 和 as ,分別提供了一種方式去檢查值的型別或者轉換它的型別。
為型別轉換定義類層次
將型別轉換用在類和子類的層次結構上,檢查特定類例項的型別並且轉換這個類例項的型別成為這個層次結構中的其他型別.
class
mediaitem
}class
movie
:mediaitem
}class
song
:mediaitem
}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")]
print
(type
(of: library)
)//array
檢查型別
用型別檢查操作符(is)來檢查乙個例項是否屬於特定子型別。若例項屬於那個子型別,型別檢查操作符返回 true,否則返回 false。
class
mediaitem
}class
movie
:mediaitem
}class
song
:mediaitem
}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")]
var moviecount =
0var songcount =
0for item in library
else
if item is
song
}print
("media library contains \(moviecount)
movies and \(songcount)
songs"
)//media library contains 2 movies and 3 songs
向下轉型
某型別的乙個常量或變數可能在幕後實際上屬於乙個子類。當確定是這種情況時,你可以嘗試用型別轉換操作符(as? 或 as!)向下轉到它的子型別。
因為向下轉型可能會失敗,型別轉型操作符帶有兩種不同形式。條件形式 as? 返回乙個試圖向下轉成的型別的可選值。強制形式 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
any 和 anyobject 的型別轉換
不確定型別特殊的型別別名:
1.any 可以表示任何型別,包括函式型別。
2.anyobject 可以表示任何類型別的例項。
var things =
[any](
)things.(0
)things.
(0.0
)things.(42
)things.
(3.14159
)things.
("hello"
)things.((
3.0,
5.0)
)things.
(movie
(name:
"ghostbusters"
, director:
"ivan reitman"))
things.()
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
any 型別可以表示所有型別的值,包括可選型別。
let optionalnumber:
int?=3
things.
(optionalnumber)
// 警告
things.
(optionalnumber as
any)
// 沒有警告
巢狀型別:
巢狀型別,可以在支援的型別中定義巢狀的列舉、類和結構體。
要在乙個型別中巢狀另乙個型別,將巢狀型別的定義寫在其外部型別的 {} 內,而且可以根據需要定義多級巢狀。
//巢狀型別
struct
blackjackcard
//巢狀 rank 列舉 描述撲克牌從ace~10,j,q,k
enum
rank
:int
var values:
values}}
let rank:
rank
, suit:
suit
var description:
string
return output
}}let theaceofspades =
blackjackcard
(rank:
.ace, suit:
.spades)
print
("the aceofspades: \(theaceofspades.description)")
//theaceofspades: suit is ♠,value is 1or11
引用巢狀型別let heartssymbol =
blackjackcard
.suit
.hearts.rawvalue //紅心符號為「♡「
swift基礎day6 錯誤處理
錯誤處理 swift 在執行時提供了丟擲 捕獲 傳遞和操作可恢復錯誤等支援。swift 中的錯誤處理涉及到錯誤處理模式與cocoa有關。表示與丟擲錯誤 遵循error 協議。表示與丟擲錯誤 enum vendingmachineerror error throw vendingmachineerro...
swift 9 型別轉換
型別轉換可以判斷例項的型別,也可以將例項看做是其父類或者子類的例項。型別轉換在 swift 中使用 is 和 as 操作符實現。這兩個操作符提供了一種簡單達意的方式去檢查值的型別或者 轉換它的型別。你也可以用它來檢查乙個類是否實現了某個協議。你可以將型別轉換用在類和子類的層次結構上,檢查特定類例項的...
Swift18 型別轉換
定義乙個型別層次作為例子 檢查型別 向下轉換 any和anyobject的型別轉換。型別轉換可以判斷例項的型別,也可以將例項看作是其父類或者子類的例項。型別轉換在swift中使用is和as操作符實現。這兩個操作符提供了一種簡單達意的方式去檢查其值的型別或者轉換它的型別。也可以用它來檢查乙個型別是否實...