泛型(一)

泛型介紹

你想要給寵物和它們的飼養(yǎng)員做一個(gè)模型。你可以使用不同的值來實(shí)現(xiàn)這一點(diǎn),也可以使用不同的類型來實(shí)現(xiàn)這一點(diǎn)。你將看到逐沙,通過使用類型(而不是值),Swift類型檢查器可以在編譯時(shí)推斷你的代碼洼畅。你不僅在運(yùn)行時(shí)做得更少吩案,從而生成更快的代碼,而且還可以捕獲僅使用值不可能解決的問題帝簇。

由其他值定義的值

假設(shè)你經(jīng)營(yíng)著一家只賣狗和貓的寵物店徘郭,你想用swift的playground來做這個(gè)生意的模型。首先丧肴,你定義了一種類型残揉,PetKind,它可以包含兩種可能的值芋浮,對(duì)應(yīng)于你出售的兩種寵物:

enum PetKind {
  case cat
  case dog 
}

現(xiàn)在抱环,假設(shè)你不僅想構(gòu)建動(dòng)物模型,還想構(gòu)建照顧寵物的員工模型途样。你的員工是高度專業(yè)化的江醇。有些飼養(yǎng)員只照看貓濒憋,有些只照看狗何暇。

所以你定義一個(gè)KeeperKind類型,如下:

struct KeeperKind {
  var keeperOf: PetKind
}

然后你可以用以下方法初始化一個(gè)貓管理員和狗管理員:

let catKeeper = KeeperKind(keeperOf: .cat)
let dogKeeper = KeeperKind(keeperOf: .dog)

如何為你的商店建模凛驮,有兩點(diǎn)需要注意裆站。
首先,你通過改變類型的值來代表不同種類的寵物和飼養(yǎng)者黔夭。寵物的種類只有一種—— PetKind——還有一種是飼養(yǎng)者—— KeeperKind宏胯。不同種類的寵物只能用不同的PetKind的值來表示,正如不同種類的飼養(yǎng)者用不同的KeeperKind的值來表示一樣本姥。

第二肩袍,一個(gè)范圍的值可能決定了另一個(gè)值的范圍。具體地說婚惫,KeeperKind值的范圍直接反映了PetKind值的范圍氛赐。

如果你的商店開始出售鳥類魂爪,你只需在PetKind枚舉中添加.bird成員,你就可以立即初始化一個(gè)值艰管,該值描述一個(gè)鳥類飼養(yǎng)員KeeperKind(keeperOf: .bird)滓侍。如果你開始銷售100種不同的寵物,你馬上就能表示100種不同的飼養(yǎng)員牲芋。

相反撩笆,你可以定義第二個(gè)不相關(guān)的枚舉,而不是KeeperKind缸浦。

在這種情況下夕冲,沒有任何東西會(huì)強(qiáng)制執(zhí)行這種關(guān)系,除非你一直在更新一個(gè)類型以鏡像另一個(gè)類型裂逐。如果你PetKind添加啦PetKind.snake耘擂,卻忘了添加EnumKeeperKind.snakeKeeper,那么事情就會(huì)變得紊亂絮姆。

但是使用KeeperKind醉冤,你可以通過PetKind類型的屬性顯式地建立關(guān)系。每一個(gè)可能的PetKind值都意味著一個(gè)相應(yīng)的KeeperKind值篙悯∫涎簦或者你可以說,PetKind集合定義了KeeperKind值集合鸽照。

總而言之螺捐,你可以這樣描述這種關(guān)系:


QQ20180702-113716@2x.png

由其他類型定義的類型

上面的模型基本上是通過改變類型的值來實(shí)現(xiàn)的。現(xiàn)在考慮另一種建模矮燎,通過改變類型本身來實(shí)現(xiàn)定血。

假設(shè)您沒有定義代表各種寵物的單一類型PetKind,而是為你出售的每種寵物定義了不同的類型诞外。如果你采用面向?qū)ο蟮姆绞綄?shí)現(xiàn)澜沟,那么這是一個(gè)相當(dāng)合理的選擇,你可以為每個(gè)寵物使用不同的方法對(duì)它們的行為進(jìn)行建模峡谊。然后你會(huì)得到以下信息:

class Cat {}
class Dog {}

那么如何表示相應(yīng)種類的飼養(yǎng)員呢?你可以簡(jiǎn)單地寫下以下內(nèi)容:

class KeeperForCats {}
class KeeperForDogs {}

但那不是很好茫虽。這種方法的問題與手動(dòng)定義KeeperKind值的并行枚舉完全相同——它依賴于你為每種類型的寵物強(qiáng)制與一種飼養(yǎng)員類型保持關(guān)系。

你真正喜歡的是一種聲明一段關(guān)系的方式既们,就像你為值所建立的關(guān)系一樣濒析。你想聲明,每一種可能的寵物類型都暗示著相應(yīng)的飼養(yǎng)員類型的存在啥纸,你描述的對(duì)應(yīng)是:


QQ20180702-115119@2x.png

你想要確定的是号杏,對(duì)于每一個(gè)可能的寵物類型,都定義了相應(yīng)的飼養(yǎng)員類型斯棒。但你不需要手動(dòng)操作盾致。你需要一種方法來自動(dòng)定義一組飼養(yǎng)員類型莹妒。

事實(shí)證明,這正是泛型的作用所在!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绰上,一起剝皮案震驚了整個(gè)濱河市旨怠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜈块,老刑警劉巖鉴腻,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異百揭,居然都是意外死亡爽哎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門器一,熙熙樓的掌柜王于貴愁眉苦臉地迎上來课锌,“玉大人,你說我怎么就攤上這事祈秕∶煜停” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵请毛,是天一觀的道長(zhǎng)志鞍。 經(jīng)常有香客問我,道長(zhǎng)方仿,這世上最難降的妖魔是什么固棚? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮仙蚜,結(jié)果婚禮上此洲,老公的妹妹穿的比我還像新娘。我一直安慰自己委粉,他們只是感情好呜师,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艳丛,像睡著了一般匣掸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氮双,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音霎匈,去河邊找鬼戴差。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铛嘱,可吹牛的內(nèi)容都是我干的暖释。 我是一名探鬼主播袭厂,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼球匕!你這毒婦竟也來了纹磺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亮曹,失蹤者是張志新(化名)和其女友劉穎橄杨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體照卦,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡式矫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了役耕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片采转。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞬痘,靈堂內(nèi)的尸體忽然破棺而出故慈,到底是詐尸還是另有隱情,我是刑警寧澤框全,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布惯悠,位于F島的核電站,受9級(jí)特大地震影響竣况,放射性物質(zhì)發(fā)生泄漏克婶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一丹泉、第九天 我趴在偏房一處隱蔽的房頂上張望情萤。 院中可真熱鬧,春花似錦摹恨、人聲如沸筋岛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)睁宰。三九已至,卻和暖如春寝凌,著一層夾襖步出監(jiān)牢的瞬間柒傻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工较木, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留红符,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像预侯,于是被迫代替她去往敵國(guó)和親致开。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355