泛型形參子句指定泛型類型或函數(shù)的類型形參,以及這些參數(shù)的關(guān)聯(lián)約束和要求。泛型形參子句用尖括號(hào)(<>)包住,并且有以下兩種形式:
<generic parameter list>
<generic parameter listwhererequirements>
泛型形參列表中泛型形參用逗號(hào)分開,每一個(gè)采用以下形式:
type parameter:constrain
泛型形參由兩部分組成:類型形參及其后的可選約束。類型形參只是占位符類型(如T,U,V,KeyType,ValueType等)的名字而已。你可以在泛型類型、函數(shù)的其余部分或者構(gòu)造器聲明,以及函數(shù)或構(gòu)造器的簽名中使用它。
約束用于指明該類型形參繼承自某個(gè)類或者遵守某個(gè)協(xié)議或協(xié)議的一部分。例如,在下面的泛型中,泛型形參T: Comparable表示任何用于替代類型形參T的類型實(shí)參必須滿足Comparable協(xié)議。
func simpleMin<T: COmparable>(x: T, y: T) -> T {
if x < y {
return y
}
return x
}
如,Int和Double均滿足Comparable協(xié)議,該函數(shù)接受任何一種類型。與泛型類型相反,調(diào)用泛型函數(shù)或構(gòu)造器時(shí)不需要指定泛型實(shí)參子句。類型實(shí)參由傳遞給函數(shù)或構(gòu)造器的實(shí)參推斷而出。
simpleMin(17, 42) // T is inferred to be Int
simpleMin(3.14159, 2.71828) // T is inferred to be Double
要想對(duì)類型形參及其關(guān)聯(lián)類型指定額外要求,可以在泛型形參列表之后添加where子句。where子句由關(guān)鍵字where及其后的用逗號(hào)分割的多個(gè)要求組成。
where子句中的要求用于指明該類型形參繼承自某個(gè)類或遵守某個(gè)協(xié)議或協(xié)議的一部分。盡管where子句有助于表達(dá)類型形參上的簡(jiǎn)單約束(如T: Comparable等同于T where T: Comparable,等等),但是依然可以用來(lái)對(duì)類型形參及其關(guān)聯(lián)約束提供更復(fù)雜的約束。如,<T where T: C, T: P>表示泛型類型T繼承自類C且遵守協(xié)議P。
如上所述,可以強(qiáng)制約束類型形參的關(guān)聯(lián)類型遵守某個(gè)協(xié)議。<T: Generator where T.Element: Equatable>表示T遵守Generator協(xié)議,而且T的關(guān)聯(lián)類型T.Element遵守Eauatable協(xié)議(T有關(guān)聯(lián)類型是因?yàn)?code style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: 14px; padding: 0px 5px; color: rgb(199, 37, 78); white-space: nowrap; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; margin: 0px 2px; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248);">Generator聲明了Element,而T遵守Generator協(xié)議)。
也可以用操作符==來(lái)指定兩個(gè)類型等效的要求。例如,有這樣一個(gè)約束:T和U遵守Generator協(xié)議,同時(shí)要求它們的關(guān)聯(lián)類型等同,可以這樣來(lái)表達(dá):<T: Generator, U: Generator where T.Element == U.Element>。
當(dāng)然,替代類型形參的類型實(shí)參必須滿足所有類型形參所要求的約束和要求。
泛型函數(shù)或構(gòu)造器可以重載,但在泛型形參子句中的類型形參必須有不同的約束或要求,抑或二者皆不同。當(dāng)調(diào)用重載的泛型函數(shù)或構(gòu)造器時(shí),編譯器會(huì)用這些約束來(lái)決定調(diào)用哪個(gè)重載函數(shù)或構(gòu)造器。
泛型類可以生成一個(gè)子類,但是這個(gè)子類也必須是泛型類。
泛型形參子句語(yǔ)法
泛型參數(shù)子句 → < 泛型參數(shù)列表 約束子句 可選 >
泛型參數(shù)列表 → 泛形參數(shù) | 泛形參數(shù) , 泛型參數(shù)列表
泛形參數(shù) →