泛型(三)

Arrays

雖然原來的Keeper類型說明了泛型類型不需要存儲任何內(nèi)容或使用它的類型參數(shù)逻淌,但泛型類型的最常見就是同時具有這兩種功能。這就是Array類型猪勇。

使用泛型數(shù)組是發(fā)明泛型類型的原始動機的一部分产禾。由于許多程序需要相同類型的數(shù)組,所以泛型數(shù)組使代碼更安全攒菠。

你一直在使用數(shù)組,但是只有[Element]的預防歉闰,而不是Array<Element>. 思考一個這樣的數(shù)組:

let animalAges: [Int] = [2,5,7,9]

這相當于下面這個數(shù)組:

let animalAges: Array<Int> = [2,5,7,9]

Array<Int>和[Int]是完全可互換的辖众。你甚至可以通過[Int]()而不是Array <Int>()來調(diào)用數(shù)組的默認初始化方法。

由于Swift數(shù)組只允許對元素序列進行索引訪問和敬,所以它們對元素類型沒有要求凹炸。但情況并非總是如此。

Dictionaries

Swift泛型允許多個類型參數(shù)和對它們的一系列復雜的限制昼弟。它們允許你使用具有關聯(lián)類型的泛型類型和協(xié)議來建立復雜的算法和數(shù)據(jù)結構啤它。字典就是一個簡單的例子。

Dictionary在逗號分隔的泛型參數(shù)列表中有兩個類型參數(shù)舱痘,它們位于尖括號之間变骡,您可以在它的聲明中看到:

struct Dictionary<Key: Hashable, Value> // etc..

Key和Value表示字典的鍵和值的類型。但是Key上的注釋芭逝,Key: Hashable表示的意義很多塌碌。冒號之后的所有內(nèi)容都是類型約束。類型約束指明了該類型參數(shù)父類型旬盯,以及所需的協(xié)議或協(xié)議列表台妆。

例如,Dictionary的類型約束要求作為Dictionary鍵的任何類型都是hashable胖翰,因為Dictionary是一個散列映射频丘,必須對其鍵進行散列,以啟用快速查找泡态。

要實例化具有多個類型參數(shù)的類型(如Dictionary),只需提供一個逗號分隔的類型參數(shù)列表:

let intNames: Dictionary<Int, String> = [42: "forty-two"]

與數(shù)組一樣迂卢,字典在Swift中也有一些特殊的處理某弦,因為它們是內(nèi)置的桐汤,而且非常常見。你已經(jīng)見過速記表示法[Key: Value]靶壮,還可以使用類型推斷:

let intNames2: [Int: String] = [42: "forty-two", 7: "seven"]
let intNames3 = [42: "forty-two", 7: "seven"]

Optionals

最后怔毛,對泛型的討論如果不提及Optionals,就不完整腾降。Optionals通過枚舉實現(xiàn)拣度,但它們也是另一種泛型類型,你可以自己定義它螃壤。

假設你正在編寫一個應用程序抗果,該應用程序允許用戶以表單的形式輸入她的生日,但不是必須的奸晴。你可能會發(fā)現(xiàn)定義enum類型很方便冤馏,如下所示:

enum OptionalDate {
  case none
  case some(Date)
}

類似地,如果另一個表單不要求用戶輸入她的姓寄啼,你可以定義以下類型:

enum OptionalString {
  case none
  case some(String)
}

然后逮光,你可以捕獲用戶所輸入或未輸入的所有信息:

struct FormResults {
  // other properties here
  var birthday: OptionalDate
  var lastName: OptionalString
}

如果你發(fā)現(xiàn)新類型在重復做這些,那么你會想把它歸納成一個泛型類型來表示“可能存在的特定類型的值”的概念墩划。因此涕刚,你可以這樣寫:

enum Optional<Wrapped> {
  case none
  case some(Wrapped)
}

此時,你將復制Swift自己的Optional < Wrapped >類型乙帮,因為這與Swift標準庫中的定義非常接近!事實證明杜漠,Optional < Wrapped >接近于一個普通的舊泛型類型,就像你自己編寫的類型一樣蚣旱。

只有當你與Optional進行交互時碑幅,它才會是一個泛型類型,比如:

var birthdate: Optional<Date> = .none
if birthdate == .none {
  // no birthdate
}

但是塞绿,當然沟涨,下面這樣的更常見也更傳統(tǒng):

var birthdate: Date? = nil
if birthdate == nil {
  // no birthdate
}

實際上,這兩個代碼塊的含義完全相同异吻。

與數(shù)組和字典一樣裹赴,optionals在語言中具有這種語法的特權地位,使使用它們更簡潔诀浪。但是所有這些特性都提供了訪問底層類型的更方便的方法棋返,這只是一個普通的枚舉類型。

泛型函數(shù)參數(shù)

到目前為止雷猪,你已經(jīng)了解了泛型類型在函數(shù)睛竣、類、結構和枚舉中的定義求摇。除了Dictionary之外射沟,所有這些都有一個通用參數(shù)殊者。

泛型類型參數(shù)列表位于類型名或函數(shù)名之后。然后可以在定義的其余部分中使用泛型參數(shù)验夯。

這個函數(shù)接受兩個參數(shù)并交換它們的順序:

func swapped<T, U>(_ x: T, _ y: U) -> (U, T) {
  return (y, x)
}
swapped(33, "Jay")  // returns ("Jay", 33)

泛型函數(shù)定義展示了語法的一個令人困惑的方面:它同時具有類型參數(shù)和函數(shù)參數(shù)猖吴。您擁有類型參數(shù)<T、U>的通用參數(shù)列表和函數(shù)參數(shù)列表(_ x: T挥转、_ y: U)海蔽。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绑谣,隨后出現(xiàn)的幾起案子党窜,更是在濱河造成了極大的恐慌,老刑警劉巖域仇,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刑然,死亡現(xiàn)場離奇詭異,居然都是意外死亡暇务,警方通過查閱死者的電腦和手機泼掠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垦细,“玉大人择镇,你說我怎么就攤上這事±ǜ模” “怎么了腻豌?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘱能。 經(jīng)常有香客問我吝梅,道長,這世上最難降的妖魔是什么惹骂? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任苏携,我火速辦了婚禮,結果婚禮上对粪,老公的妹妹穿的比我還像新娘右冻。我一直安慰自己,他們只是感情好著拭,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布纱扭。 她就那樣靜靜地躺著,像睡著了一般儡遮。 火紅的嫁衣襯著肌膚如雪乳蛾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音屡久,去河邊找鬼忆首。 笑死,一個胖子當著我的面吹牛被环,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播详幽,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼筛欢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了唇聘?” 一聲冷哼從身側響起版姑,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迟郎,沒想到半個月后剥险,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡宪肖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年表制,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片控乾。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡么介,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜕衡,到底是詐尸還是另有隱情壤短,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布慨仿,位于F島的核電站久脯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏镰吆。R本人自食惡果不足惜帘撰,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鼎姊。 院中可真熱鬧骡和,春花似錦、人聲如沸相寇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唤衫。三九已至婆赠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背休里。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工蛆挫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妙黍。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓悴侵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拭嫁。 傳聞我的和親對象是個殘疾皇子可免,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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