以擼代碼的形式學(xué)習(xí)Swift-23:泛型(Generics)

泛型是 Swift 最強(qiáng)大的特性之一霜第,許多 Swift 標(biāo)準(zhǔn)庫(kù)是通過(guò)泛型代碼構(gòu)建的葛家。
例如, Swift 的數(shù)組和字典都是泛型集合泌类。你可以創(chuàng)建一個(gè)存有整型值或者字符串值的數(shù)組癞谒,有必要的話,還可以創(chuàng)建一個(gè)任何 Swift 支持類型的數(shù)組。類似的弹砚,你也可以創(chuàng)建一個(gè)字典用于存儲(chǔ)任意指定類型的值双仍。

1 泛型函數(shù)

T是一個(gè)占位類型,其他字母也可以桌吃,只要在尖括號(hào)中就行殊校。
可以理解為:在定義的時(shí)候還不知道是啥類型,那就假設(shè)是T類型读存,等到調(diào)用時(shí)为流,給過(guò)來(lái)什么類型的參數(shù),那T就是上面類型让簿。

func swapValue<T>(_ a: inout T, _ b: inout T) {
    let tmp = a
    a = b
    b = tmp
}
var a = 1
var b = 3
swapValue(&a, &b)
print(a,b)
var s1 = "word"
var s2 = "單詞"
swapValue(&s1, &s2)
print(s1, s2)

2 類型參數(shù)

T就是類型參數(shù)敬察。可以定義多個(gè)類型參數(shù)尔当。

3 命名類型參數(shù):就是把類型參數(shù)命名為一個(gè)容易閱讀的名字(大寫(xiě)字母開(kāi)頭的駝峰命名法)莲祸。

Dictionary<Key, Value>
Array<Element>

4 泛型類型

struct Stack<Element> {
    var items = [Element]()
    mutating func push(item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}
var stackOfStrings = Stack<String>()
stackOfStrings.push(item: "uno")
stackOfStrings.push(item: "dos")
stackOfStrings.push(item: "tres")
stackOfStrings.push(item: "cuatro")

5 擴(kuò)展一個(gè)泛型類型

不需要在擴(kuò)展的定義中提供類型參數(shù)列表。原始類型定義中聲明的類型參數(shù)列表在擴(kuò)展中可以直接使用椭迎,并且這些來(lái)自原始類型中的參數(shù)名稱會(huì)被用作原始定義中類型參數(shù)的引用锐帜。

extension Stack {
    var topItem: Element? {
        return items.isEmpty ? nil : items[items.count - 1]
    }
}

6 類型約束:指定一個(gè)類型參數(shù)必須繼承自指定類,或者符合一個(gè)特定的協(xié)議或協(xié)議組合畜号。

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { // 這里是泛型函數(shù)的函數(shù)體部分
}

func findIndex<T>(array: [T], _ valueToFind: T) -> Int? {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

不是所有的 Swift類型都可以用等式符(==)進(jìn)行比較缴阎。
Swift標(biāo)準(zhǔn)庫(kù)中定義了一個(gè) Equatable 協(xié)議,該協(xié)議要求任何遵循該協(xié)議的類型必須實(shí)現(xiàn)等式符( == )及不等符( != )简软。

func findIndex<T: Equatable>(array: [T], _ valueToFind: T) -> Int? {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}

7 關(guān)聯(lián)類型

關(guān)聯(lián)類型為協(xié)議中的 某個(gè)類型提供了一個(gè)占位名(或者說(shuō)別名)蛮拔,其代表的實(shí)際類型在協(xié)議被采納時(shí)才會(huì)被指定。

protocol Container {
    associatedtype ItemType
    mutating func append(item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}
struct Stack2<Element>: Container {
    // Stack<Element> 的原始實(shí)現(xiàn)部分 
    var items = [Element]()
    mutating func push(item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
    // Container 協(xié)議的實(shí)現(xiàn)部分
    mutating func append(item: Element) {
        self.push(item: item)
    }
    var count: Int {
        return items.count
    }
    subscript(i: Int) -> Element {  // swift 可以推斷出ItemType就是Element
        return items[i]
    }
}

playground文件在andyRon/LearnSwift

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痹升,一起剝皮案震驚了整個(gè)濱河市建炫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疼蛾,老刑警劉巖肛跌,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異察郁,居然都是意外死亡衍慎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)绳锅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)西饵,“玉大人,你說(shuō)我怎么就攤上這事鳞芙【烊幔” “怎么了期虾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)驯嘱。 經(jīng)常有香客問(wèn)我镶苞,道長(zhǎng),這世上最難降的妖魔是什么鞠评? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任茂蚓,我火速辦了婚禮,結(jié)果婚禮上剃幌,老公的妹妹穿的比我還像新娘聋涨。我一直安慰自己,他們只是感情好负乡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布牍白。 她就那樣靜靜地躺著,像睡著了一般抖棘。 火紅的嫁衣襯著肌膚如雪茂腥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天切省,我揣著相機(jī)與錄音最岗,去河邊找鬼。 笑死朝捆,一個(gè)胖子當(dāng)著我的面吹牛般渡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播右蹦,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诊杆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了何陆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豹储,失蹤者是張志新(化名)和其女友劉穎贷盲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體剥扣,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巩剖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钠怯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佳魔。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖晦炊,靈堂內(nèi)的尸體忽然破棺而出鞠鲜,到底是詐尸還是另有隱情宁脊,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布贤姆,位于F島的核電站榆苞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏霞捡。R本人自食惡果不足惜坐漏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碧信。 院中可真熱鬧赊琳,春花似錦、人聲如沸砰碴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衣式。三九已至寸士,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碴卧,已是汗流浹背弱卡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留住册,地道東北人婶博。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荧飞,于是被迫代替她去往敵國(guó)和親凡人。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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