類型轉換在 Swift 中使用 is 和 as 操作符實作。is用于判斷執行個體的類型,as用于轉換執行個體的類型。
1.從一個示例談起
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"),
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")
];
//檢查類型:用類型檢查操作符(is)來檢查一個執行個體是否屬于特定子類型。若執行個體屬于那個子類型,類型檢查操作符傳回 true,否則傳回 false。
var movieCount = 0;
var songCount = 0;
for item in library
{
if item is Movie
{
movieCount += 1; //執行兩次
}
else if item is Song
{
songCount += 1; //執行三次
}
}
print("Media library contains \(movieCount) movies and \(songCount) songs"); //"Media library contains 2 movies and 3 songs\n"
//向下轉型:某類型的一個常量或變量可能在幕後實際上屬于一個子類。當确定是這種情況時,你可以嘗試向下轉到它的子類型,用類型轉換操作符(as? 或 as!)。
for item in library
{
if let movie = item as? Movie
{
print("Movie: '\(movie.name)', dir. \(movie.director)");
}
else if let song = item as? Song
{
print("Song: '\(song.name)', by \(song.artist)");
}
}
/*
列印結果:
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
*/
2.Any 和 AnyObject 的類型轉換
Swift 為不确定類型提供了兩種特殊的類型别名:
- AnyObject:可以表示任何類類型的執行個體。
- Any:可以表示任何類型,包括函數類型。
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);
}
}
let someObjects: [AnyObject] = [
Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"),
Movie(name: "Moon", director: "Duncan Jones"),
Movie(name: "Alien", director: "Ridley Scott")
];
for movie in someObjects as! [Movie] {
print("Movie: '\(movie.name)', dir. \(movie.director)");
}
/*
列印結果:
Movie: '2001: A Space Odyssey', dir. Stanley Kubrick
Movie: 'Moon', dir. Duncan Jones
Movie: 'Alien', dir. Ridley Scott
*/
var things = [Any]();
things.append(0);
things.append(0.0);
things.append("Hello World");
print("\(things)"); //[0, 0.0, "Hello World"]
無善無惡心之體,
有善有惡意之動,
知善知惡是良知,
為善去惡是格物。