Swift4 基礎(chǔ)部分: Type Casting(類型轉(zhuǎn)換)

本文是學(xué)習(xí)《The Swift Programming Language》整理的相關(guān)隨筆富蓄,基本的語法不作介紹凤巨,主要介紹Swift中的一些特性或者與OC差異點婚瓜。

系列文章:

Type casting is a way to check the type of an instance, or to treat 
that instance as a different superclass or subclass from somewhere 
else in its own class hierarchy.
  • 類型轉(zhuǎn)換可以用來檢測實例的類型锡移,或者將實例看成父類或子類的實例。

為類型轉(zhuǎn)化定義一個類的層級(Defining a Class Hierarchy for Type Casting)

例子:

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")
];

檢查類型(Checking Type)

Use the type check operator (is) to check whether an instance is of a 
certain subclass type.
  • 利用檢查操作符is去檢查實例是否是一個特定的子類類型砚婆。

例子:

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");

執(zhí)行結(jié)果:

Media library contains 2 movies and 3 songs

向下轉(zhuǎn)換(Downcasting)

A constant or variable of a certain class type may actually refer to 
an instance of a subclass behind the scenes. Where you believe this is 
the case, you can try to downcast to the subclass type with a type 
cast operator (as? or as!).
  • 當(dāng)一個常量或變量實際上是一個子類的實例時,可以使用as? or as向下轉(zhuǎn)化突勇。

例子:

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("Movie: \(song.name), by \(song.artist)");
    }
}

執(zhí)行結(jié)果:

Media library contains 2 movies and 3 songs
Movie: Casablanca, dir. Michael Curtiz
Movie: Blue Suede Shoes, by Elvis Presley
Movie: Citizen Kane, dir. Orson Welles
Movie: The One And Only, by Chesney Hawkes
Movie: Never Gonna Give You Up, by Rick Astley

AnyAnyObject的類型轉(zhuǎn)換(Type Casting for Any and AnyObject)

Swift provides two special types for working with nonspecific types:

Any can represent an instance of any type at all, including function 
types.

AnyObject can represent an instance of any class type.
  • Any可以表示任何類型的實例包括函數(shù)類型装盯。
  • Anyobject可以表示任何類類型的實例。

例子:

var things = [Any]();
things.append(0);
things.append(0.1);
things.append((3.0,5.0));
things.append("hello");

for thing in things {
    switch thing {
        case 0 as Int:
            print("zero as an Int");
        case 0 as Double:
            print("zero as a Double");
        case let someInt as Int:
            print("an integer value of \(someInt)")
        case let someDouble as Double where someDouble > 0:
            print("a positive double value of \(someDouble)");
        case let someString as String:
            print("a string value of \"\(someString)\"")
        case let (x, y) as (Double, Double):
            print("an (x, y) point at \(x), \(y)")
        default:
            print("something else");
    }
}

執(zhí)行結(jié)果:

zero as an Int
a positive double value of 0.1
an (x, y) point at 3.0, 5.0
a string value of "hello"

這里簡單擴展一下NSObject,AnyObject,Any的區(qū)別与境。

例子

class Example{}
class ObjectExample:NSObject{}
var example:Example = Example();
var objectExample:ObjectExample = ObjectExample();
print(example is NSObject);
print(example is AnyObject);
print(objectExample is NSObject);
print(objectExample is AnyObject);

執(zhí)行結(jié)果

false
true
true
true
  • 1.每一個NSObject對象都是AnyObject,單并非每一個AnyObject都是NSObject验夯。
  • 2.NSObjectSwift中需要顯示繼承。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摔刁,一起剝皮案震驚了整個濱河市挥转,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖绑谣,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件党窜,死亡現(xiàn)場離奇詭異,居然都是意外死亡借宵,警方通過查閱死者的電腦和手機幌衣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壤玫,“玉大人豁护,你說我怎么就攤上這事∮洌” “怎么了楚里?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猎贴。 經(jīng)常有香客問我班缎,道長,這世上最難降的妖魔是什么她渴? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任达址,我火速辦了婚禮,結(jié)果婚禮上趁耗,老公的妹妹穿的比我還像新娘沉唠。我一直安慰自己,他們只是感情好对粪,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布右冻。 她就那樣靜靜地躺著,像睡著了一般著拭。 火紅的嫁衣襯著肌膚如雪蔓倍。 梳的紋絲不亂的頭發(fā)上装畅,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天伍伤,我揣著相機與錄音抛杨,去河邊找鬼。 笑死鄙币,一個胖子當(dāng)著我的面吹牛肃叶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播十嘿,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼因惭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绩衷?” 一聲冷哼從身側(cè)響起蹦魔,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤激率,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勿决,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乒躺,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年低缩,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘉冒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡咆繁,死狀恐怖讳推,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玩般,我是刑警寧澤娜遵,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站壤短,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏慨仿。R本人自食惡果不足惜久脯,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镰吆。 院中可真熱鬧帘撰,春花似錦、人聲如沸万皿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牢硅。三九已至蹬耘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間减余,已是汗流浹背综苔。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留位岔,地道東北人如筛。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像抒抬,于是被迫代替她去往敵國和親杨刨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 2016年10月12日 Objective-C id為Swift Any Swift 3接口與Objective-...
    魔靈FH閱讀 2,849評論 0 19
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,783評論 1 10
  • 類型轉(zhuǎn)換 可以判斷實例的類型擦剑。 類型轉(zhuǎn)換在 Swift 中使用 is和 as操作符實現(xiàn)妖胀。 類型轉(zhuǎn)換可以檢查一個類型...
    勇往直前888閱讀 616評論 0 0
  • 本來說好的一星期一篇的我又食言了芥颈,現(xiàn)在補上。逼著自己輸出這件事做粤,也不知道跟誰學(xué)會的浇借,痛并快樂著。我的輸入完全來自于...
    內(nèi)有基坑閱讀 437評論 12 2
  • 你知道嗎怕品?我最愛你做自己的樣子妇垢。愿你十年后童心還在,好奇心還在肉康。 十年后闯估,你可能不再需要呆在父母的大傘之下,或許你...
    一默閱讀 199評論 4 2