Swift 泛型參数
原文:http://www.cocoachina.com/newbie/basic/2014/0612/8802.html
本頁內容包含:泛型形參語句和泛型實參語句
?
本節涉及泛型類型、泛型函數以及泛型構造器的參數,包含形參和實參。聲明泛型類型、函數或構造器時,須指定對應的類型參數。類型參數相當于一個占位符,當實例化泛型類型、調用泛型函數或泛型構造器時,就用詳細的類型實參替代之。
?
關于 Swift 語言的泛型概述,見泛型(第二部分第22章)。
?
泛型形參語句
泛型形參語句指定泛型類型或函數的類型形參,以及這些參數的關聯約束和要求。泛型形參語句用尖括號(<>)包住,而且有下面兩種形式:
泛型形參列表中泛型形參用逗號分開,每個採用下面形式:
泛型形參由兩部分組成:類型形參及其后的可選約束。類型形參僅僅是占位符類型(如T,U,V,KeyType,ValueType等)的名字而已。你能夠在泛型類型、函數的其余部分或者構造器聲明,以及函數或構造器的簽名中使用它。
?
約束用于指明該類型形參繼承自某個類或者遵守某個協議或協議的一部分。比如,在以下的泛型中,泛型形參T: Comparable表示不論什么用于替代類型形參T的類型實參必須滿足Comparable協議。
func?simpleMin<T:?Comparable>(x:?T,?y:?T)?->?T?{?????if?x?<?y?{?????????return?y?????}?????return?x?}?如,Int和Double均滿足Comparable協議,該函數接受不論什么一種類型。與泛型類型相反,調用泛型函數或構造器時不須要指定泛型實參語句。類型實參由傳遞給函數或構造器的實參判斷而出。
simpleMin(17,?42)?//?T?is?inferred?to?be?Int?simpleMin(3.14159,?2.71828)?//?T?is?inferred?to?be?Double??
Where語句
要想對類型形參及其關聯類型指定額外要求,能夠在泛型形參列表之后加入where語句。where語句由keywordwhere及其后的用逗號切割的多個要求組成。
?
where語句中的要求用于指明該類型形參繼承自某個類或遵守某個協議或協議的一部分。雖然where語句有助于表達類型形參上的簡單約束(如T: Comparable等同于T where T: Comparable,等等),可是依舊能夠用來對類型形參及其關聯約束提供更復雜的約束。如,<T where T: C, T: P>表示泛型類型T繼承自類C且遵守協議P。
?
如上所述,能夠強制約束類型形參的關聯類型遵守某個協議。<T: Generator where T.Element: Equatable>表示T遵守Generator協議,并且T的關聯類型T.Element遵守Eauatable協議(T有關聯類型是由于Generator聲明了Element,而T遵守Generator協議)。
?
也能夠用操作符==來指定兩個類型等效的要求。比如,有這樣一個約束:T和U遵守Generator協議,同一時候要求它們的關聯類型等同,能夠這樣來表達:<T: Generator, U: Generator where T.Element == U.Element>。
?
當然,替代類型形參的類型實參必須滿足全部類型形參所要求的約束和要求。
?
泛型函數或構造器能夠重載,但在泛型形參語句中的類型形參必須有不同的約束或要求,抑或二者皆不同。當調用重載的泛型函數或構造器時,編譯器會用這些約束來決定調用哪個重載函數或構造器。
?
泛型類能夠生成一個子類,可是這個子類也必須是泛型類。
GRAMMAR OF A GENERIC PARAMETER CLAUSE
generic-parameter-clause?→?<-generic-parameter-list-requirement-clause-opt->-
generic-parameter-list?→?generic-parameter-??generic-parameter-,-generic-parameter-list-
generic-parameter?→?type-name-
generic-parameter?→?type-name-:-type-identifier-
generic-parameter?→?type-name-:-protocol-composition-type-
requirement-clause?→?where-requirement-list-
requirement-list?→?requirement-??requirement-,-requirement-list-
requirement?→?conformance-requirement-??same-type-requirement-
conformance-requirement?→?type-identifier-:-type-identifier-
conformance-requirement?→?type-identifier-:-protocol-composition-type-
same-type-requirement?→?type-identifier-==-type-identifier-
?
泛型實參語句
泛型實參語句指定泛型類型的類型實參。泛型實參語句用尖括號(<>)包住,形式例如以下:
泛型實參列表中類型實參有逗號分開。類型實參是實際詳細類型的名字,用來替代泛型類型的泛型形參語句中的對應的類型形參。從而得到泛型類型的一個特化版本號。如,Swift標準庫的泛型字典類型定義例如以下:
struct?Dictionary<KeyType:?Hashable,?ValueType>:?Collection,?DictionaryLiteralConvertible?{?????/*?...?*/?}?泛型Dictionary類型的特化版本號,Dictionary<String, Int>就是用詳細的String和Int類型替代泛型類型KeyType: Hashable和ValueType產生的。每個類型實參必須滿足它所替代的泛型形參的全部約束,包含不論什么where語句所指定的額外的要求。上面的樣例中,類型形參KeyType要求滿足Hashable協議,因此String也必須滿足Hashable協議。
?
能夠用本身就是泛型類型的特化版本號的類型實參替代類型形參(如果已滿足合適的約束和要求)。比如,為了生成一個元素類型是整型數組的數組,能夠用數組的特化版本號Array<Int>替代泛型類型Array<T>的類型形參T來實現。
let?arrayOfArrays:?Array<Array<Int>>?=?[[1,?2,?3],?[4,?5,?6],?[7,?8,?9]]?如泛型形參語句所述,不能用泛型實參語句來指定泛型函數或構造器的類型實參。
?
泛型實參語法:
generic-argument-clause?→?<-generic-argument-list->-
generic-argument-list?→?generic-argument-??generic-argument-,-generic-argument-list-
generic-argument?→?type
轉載于:https://www.cnblogs.com/gcczhongduan/p/4005007.html
總結
以上是生活随笔為你收集整理的Swift 泛型參数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS6新特征:UICollection
- 下一篇: 使用SDWebImage淡入淡出的方式加